Frage

Ich arbeite ein Schachspiel in Java auf dem Aufbau, und ich bin zur Zeit ein wenig Mühe, die GUI genau so, wie ich es will mit Schaukel mit. Ich bin mit einem GridLayout ein Raster von 8x8 ChessButtons zu organisieren (die die JButton außer Kraft setzen, so dass ich zusätzliche Informationen in ihnen gespeichert werden können, wie beispielsweise Koordinaten). Ursprünglich würden die ChessButtons nicht angezeigt, wenn ich über sie moused, aber ich löste das Problem, indem jeder ChessButton in einem separaten JPanel platzieren und jede Taste des setPreferredSize() auf eine festgelegte Höhe und Breite einstellen.

Nun, mein Problem ist, dass es scheint, über eine kleine Marge oder padding zu sein (und / oder unten?) Jede Taste. Ich habe sicher Satz setHgap(0) und setVgap(0) für die GridLayout gemacht, so dass ich bin mir ziemlich sicher, dass die geheimnisvolle Marge herkommt entweder die Tasten oder die JPanels. Aber ich kann nicht scheinen, um sie los zu werden, und sie scheinen sich ChessButton zu verursachen ein wenig verschieben Bit nach oben / unten, wenn ich die Maus von ihnen.

Ich weiß, diese Beschreibung des Problems könnte ein wenig schwer zu visualisieren, so dass ich einen Screenshot gemacht habe (mit JButtons statt ChessButtons so die Lücken etwas leichter zu erkennen sind): http://img3.imageshack.us/img3/6656/jbuttonmargins.png

Hier ist der Code, den ich verwendet, um jede ChessButton zu initialisieren:

    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);
    }

Also, wie kann ich diese vertikalen Abstände zwischen Tasten los? Ich bin relativ neu Swing, so tut mir leid, wenn die Antwort sehr offensichtlich ist, aber ich würde jede mögliche Hilfe jedermann zu schätzen wissen zu bieten haben! Vielen Dank im Voraus!

War es hilfreich?

Lösung

  

Ursprünglich würden die ChessButtons nicht angezeigt, wenn ich über sie moused, aber ich löste das Problem, indem jeden ChessButton in einem separaten JPanel platzieren und jede Taste der setPreferredSize Einstellung () auf eine festgelegte Höhe und Breite

Das ist nicht die richtige Lösung. Es gibt keinen Grund, ein JPanel zu verwenden, um die Tasten zu halten. In der Tat ist dies wahrscheinlich die Ursache des Problems. Die Tasten erscheinen sollen, wenn Sie sie zu einem Gridlayout hinzufügen. Wenn sie nicht auftauchen seine wahrscheinlich, weil Sie hinzugefügt, um die Schaltflächen auf der GUI, nachdem Sie die GUI sichtbar. Komponenten sollten den GUI hinzugefügt werden, bevor sie sichtbar gemacht wird.

  

Nun, mein Problem ist, dass es scheint, oben (und / oder unten?) Eine geringe Marge oder padding zu jeder Taste

Ich verstehe nicht, warum auch gibt es keine horizontale Lücke. Wenn Sie eine JPanel erstellen, die standardmäßig verwendet es einen Flowlayout, die auch einen horizontalen / vertikalen Spalt von 5 Pixeln enthält. So verstehe ich, warum könnten Sie den vertikalen Abstand von 10 Pixeln haben. Ich verstehe nicht, warum es keine horizontale Lücke ist.

Wenn Sie weitere Hilfe benötigen, um Ihre Post SSCCE demonstriert das Problem. Und die SSCCE sollten regelmäßige JButtons verwenden. Holen Sie sich die Grundlagen mit Standardkomponenten arbeiten, bevor Sie spielen mit benutzerdefinierten Komponenten starten. Auf diese Weise wissen Sie, wenn das Problem mit Ihrem eigenen Code ist oder nicht.

Andere Tipps

Do keine leere Grenze hinzuzufügen; Verwenden Sie setBorderPainted(false) .

Nachtrag: Wie @camickr Notizen, das Layout der Platte kann Standard Lücken enthält. Das folgende Beispiel verwendet keinen Spalt GridLayout entsprechend.

alt text

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();
            }
        });
    }
}

Versuchen Sie, chessBoard.setPreferredSize (600, 600) eine JPanel für das Board zu schaffen, dass nur Zimmer verfügt über die Tasten (8 Tasten pro Strecke * 75 Größe jede Art und Weise auf den Tasten) passen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top