Java Swing - JPanel y GridLayout Márgenes / Relleno
-
30-09-2019 - |
Pregunta
Estoy trabajando en la construcción de una partida de ajedrez en Java, y actualmente estoy teniendo un poco de problemas para conseguir la interfaz gráfica de usuario exactamente como lo quiero con Swing. Estoy usando un GridLayout
para organizar una cuadrícula de 8x8 ChessButton
s (que anula la JButton
para que pueda almacenar información adicional en el interior de ellos, tales como coordenadas). Originalmente, no aparecerían los ChessButton
s a menos que yo ratón por encima de ellos, pero resuelto ese problema mediante la colocación de cada uno dentro de un ChessButton
JPanel
independiente y establecer setPreferredSize()
de cada botón a una determinada altura y anchura.
Ahora, mi problema es que parece que hay un pequeño margen o por encima de relleno (y / o por debajo?) Cada botón. Me he asegurado al conjunto setHgap(0)
y setVgap(0)
para la GridLayout
, así que estoy bastante seguro de que el misterioso margen proviene de cualquiera de los botones o los JPanel
s. Sin embargo, no puedo parecer para deshacerse de ellos, y que parecen ser la causa de cada ChessButton
para desplazar un poco hacia arriba / abajo cada vez que el ratón de ellos.
Me da cuenta de esta descripción del problema podría ser un poco difícil de visualizar, por lo que he tomado una captura de pantalla (utilizando JButton
s en lugar de ChessButton
s por lo que los espacios son un poco más fácil de reconocer): http://img3.imageshack.us/img3/6656/jbuttonmargins.png
Aquí está el código que utiliza para inicializar cada ChessButton
:
chessBoard = new JPanel(new GridLayout(8, 8, 0, 0));
chessBoard.setBorder(BorderFactory.createEmptyBorder());
for (int i = 0; i <= 65; i++) {
//Create a new ChessButton
ChessButton button = new ChessButton("hi");
button.setBorder(BorderFactory.createEmptyBorder());
button.setPreferredSize(new Dimension(75, 75));
button.setMargin(new Insets(0, 0, 0, 0));
//Create a new JPanel that the ChessButton will go into
JPanel buttonPanel = new JPanel();
buttonPanel.setPreferredSize(new Dimension(75, 75));
buttonPanel.setBorder(BorderFactory.createEmptyBorder());
buttonPanel.add(button);
//Add the buttonPanel to the grid
chessBoard.add(buttonPanel);
}
Entonces, ¿cómo puedo deshacerme de estos espacios verticales entre los botones? Soy relativamente nuevo en Swing, así que lo siento si la respuesta es muy obvia, pero te agradecería cualquier ayuda cualquier persona podría tener una oferta! Gracias de antemano!
Solución
En un principio, no aparecería las ChessButtons a menos que yo ratón por encima de ellos, pero resuelto ese problema mediante la colocación de cada ChessButton dentro de un JPanel independiente y establecer setPreferredSize de cada botón () para una determinada altura y anchura
Esa no es la solución adecuada. No hay ninguna razón para utilizar un JPanel para sostener los botones. De hecho, esta es probablemente la causa del problema. Los botones deben aparecer cuando se agregan a un GridLayout. Si ellos no se presentan debido a su probable que añada los botones a la interfaz gráfica de usuario después de hacer la interfaz gráfica de usuario visible. Los componentes deben ser añadidos a la interfaz gráfica de usuario antes de que esté visible.
Ahora, mi problema es que parece que hay un pequeño margen o por encima de relleno (y / o por debajo?) Cada botón
No entiendo por qué hay tampoco una brecha horizontal. Cuando se crea un JPanel, por defecto se utiliza un FlowLayout que también contiene un espacio horizontal / vertical de 5 píxeles. Por lo que entiendo por qué es posible que tenga la distancia vertical de 10 píxeles. No entiendo por qué no hay un espacio horizontal.
Si necesita más ayuda después de su SSCCE que demuestra el problema. Y el SSCCE debe utilizar JButtons regulares. Obtener las bases que trabajan con componentes estándar antes de empezar a jugar con los componentes personalizados. De esa manera usted sabe si el problema es con el código personalizado o no.
Otros consejos
No agregue un borde vacío; hacer uso setBorderPainted(false)
.
Adición: Como @camickr notas, el diseño del panel puede incluir huecos por defecto. El ejemplo a continuación usos GridLayout
no-hueco en consecuencia.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/** @see http://stackoverflow.com/questions/4331699 */
public class ButtonBorder extends JPanel {
private static final int N = 8;
private static final int SIZE = 75;
public ButtonBorder() {
super(new GridLayout(N, N));
this.setPreferredSize(new Dimension(N * SIZE, N * SIZE));
for (int i = 0; i < N * N; i++) {
this.add(new ChessButton(i));
}
}
private static class ChessButton extends JButton {
public ChessButton(int i) {
super(i / N + "," + i % N);
this.setOpaque(true);
this.setBorderPainted(false);
if ((i / N + i % N) % 2 == 1) {
this.setBackground(Color.gray);
}
}
}
private void display() {
JFrame f = new JFrame("ButtonBorder");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new ButtonBorder().display();
}
});
}
}
Trate de añadir chessBoard.setPreferredSize (600, 600) para crear un JPanel para la junta que sólo tiene espacio para poner los botones (8 botones por trayecto * 75 tamaño en cada sentido en los botones).