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 ChessButtons (que anula la JButton para que pueda almacenar información adicional en el interior de ellos, tales como coordenadas). Originalmente, no aparecerían los ChessButtons 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 JPanels. 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 JButtons en lugar de ChessButtons 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!

¿Fue útil?

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.

text alt

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top