Java Swing - JPanel und Gridlayout Ränder / Padding
-
30-09-2019 - |
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 ChessButton
s 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 ChessButton
s 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 JPanel
s. 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 JButton
s statt ChessButton
s 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!
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.
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.