Java Swing - JPanel e GridLayout Margini / Imbottitura
-
30-09-2019 - |
Domanda
sto lavorando sulla costruzione di una partita a scacchi in Java, e sto attualmente avendo un po 'di difficoltà a raggiungere l'interfaccia grafica esattamente come voglio con Swing. Sto utilizzando un GridLayout
per organizzare una griglia di 8x8 ChessButton
s (che esclude la JButton
modo che possa conservare informazioni supplementari all'interno di essi, come coordinate). In origine, i ChessButton
s non apparirebbero meno che il mouse su di loro, ma ho risolto il problema mettendo ogni ChessButton
all'interno di una JPanel
separato e regolazione setPreferredSize()
di ciascun pulsante ad un'altezza set e la larghezza.
Ora, il mio problema è che sembra che ci sia un piccolo margine o padding sopra (e / o sotto?) Ogni pulsante. Ho fatto in modo di setHgap(0)
set e setVgap(0)
per il GridLayout
, quindi sono abbastanza sicuro che il margine misteriosa proviene da entrambi i tasti o le JPanel
s. Ma, io non riesco a sbarazzarsi di loro, e sembrano essere la causa di ogni ChessButton
a spostare un po 'su / giù ogni volta che il mouse di loro.
mi rendo conto questa descrizione del problema potrebbe essere un po 'difficile da visualizzare, così ho preso uno screenshot (utilizzando JButton
s piuttosto che ChessButton
s così le lacune sono leggermente più facili da riconoscere): http://img3.imageshack.us/img3/6656/jbuttonmargins.png
Ecco il codice che ho usato per inizializzare ogni 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);
}
Quindi, come posso liberarmi di questi spazi verticali tra i pulsanti? Sono relativamente nuovo a Swing, quindi mi dispiace se la risposta è estremamente ovvia, ma Apprezzerei tutto l'aiuto che chiunque potrebbe avere da offrire! Grazie in anticipo!
Soluzione
In origine, i ChessButtons sarebbe non appare a meno che il mouse su di loro, ma ho risolto il problema mettendo ogni ChessButton all'interno di un JPanel separato e regolazione setPreferredSize di ciascun pulsante () ad un'altezza e larghezza set
Questa non è la soluzione corretta. Non v'è alcun motivo per utilizzare un JPanel per tenere premuti i pulsanti. In realtà, questa è probabilmente la causa del problema. I pulsanti dovrebbero mostrare quando li si aggiunge ad un GridLayout. Se essi non si presentano proprio probabilmente perché si è aggiunto i pulsanti per la GUI dopo aver effettuato la GUI visibile. I componenti dovrebbero essere aggiunti alla GUI prima che sia reso visibile.
Ora, il mio problema è che sembra che ci sia un piccolo margine o padding sopra (e / o sotto?) Ogni pulsante
Non capisco perché non c'è anche un gap orizzontale. Quando si crea un JPanel, per default utilizza una FlowLayout che contiene anche una distanza orizzontale / verticale di 5 pixel. Così ho capito perché si potrebbe avere la distanza verticale di 10 pixel. Non capisco il motivo per cui non vi sia spazio orizzontale.
Se avete bisogno di più Aiuto Inserisci SSCCE dimostrando il problema. E lo SSCCE dovrebbe usare JButtons regolari. Ottenere le basi che lavorano con componenti standard, prima di iniziare a giocare con i componenti personalizzati. In questo modo si sa se il problema è con il vostro codice personalizzato o no.
Altri suggerimenti
Non aggiungere un confine vuoto; fare uso setBorderPainted(false)
.
Addendum: Come @camickr note, il layout del pannello può includere spazi vuoti predefiniti. L'esempio che segue usi non-gap GridLayout
conseguenza.
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();
}
});
}
}
Prova ad aggiungere chessBoard.setPreferredSize (600, 600) per creare un JPanel per la scheda che solo ha spazio per montare i pulsanti (8 tasti a corsa * 75 dimensioni a tratta sui pulsanti).