[英]Java Swing - JPanel and GridLayout Margins/Padding
我正在努力用Java構建一個國際象棋游戲,我目前在使用Swing完全按照我想要的方式獲取GUI時遇到了一些麻煩。 我正在使用GridLayout
來組織一個8x8 ChessButton
的網格(覆蓋JButton
以便我可以在其中存儲額外的信息,如坐標)。 最初, ChessButton
不會出現,除非我把它們ChessButton
了,但我通過將每個ChessButton
放在一個單獨的JPanel
並將每個按鈕的setPreferredSize()
設置為設定的高度和寬度來解決這個問題。
現在,我的問題是每個按鈕上方(和/或下方?)似乎有一個小的邊距或填充。 我已經確保為GridLayout
設置setVgap(0)
setHgap(0)
和setVgap(0)
,所以我很確定神秘的邊緣來自按鈕或JPanel
。 但是,我似乎無法擺脫它們,而且它們似乎會導致每個ChessButton
在我老鼠的時候向上/向下移動一點點。
我意識到這個問題的描述可能有點難以想象,所以我拍了一張截圖(使用JButton
而不是ChessButton
因此差距更容易識別): http : ChessButton
IMG3 / 6656 / jbuttonmargins.png
這是我用來初始化每個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);
}
那么,我怎樣才能擺脫按鈕之間的這些垂直空間呢? 我對Swing比較新,所以如果答案非常明顯,我很抱歉,但我很感激任何人可能提供的任何幫助! 提前致謝!
不要添加空邊框; 使用setBorderPainted(false)
。
附錄:正如@camickr所說,面板的布局可能包含默認間隙。 下面的示例相應地使用無間隙GridLayout
。
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();
}
});
}
}
最初,ChessButtons不會出現,除非我將它們蒙上,但我通過將每個ChessButton放在一個單獨的JPanel中並將每個按鈕的setPreferredSize()設置為設置的高度和寬度來解決這個問題
這不是正確的解決方案。 沒有理由使用JPanel來按住按鈕。 事實上,這可能是問題的原因。 將它們添加到GridLayout時,按鈕應顯示。 如果它們沒有顯示它可能是因為您在使GUI可見后將按鈕添加到GUI。 組件應該在顯示之前添加到GUI中。
現在,我的問題是每個按鈕上方(和/或下方?)似乎有一個小的邊距或填充
我不明白為什么也沒有橫向差距。 創建JPanel時,默認情況下它使用FlowLayout,它還包含5像素的水平/垂直間隙。 所以我理解為什么你可能有10像素的垂直間隙。 我不明白為什么沒有橫向差距。
如果您需要更多幫助,請在SSCCE上發布問題。 SSCCE應該使用常規的JButton。 在開始使用自定義組件之前,先了解使用標准組件的基礎知識。 這樣您就知道問題是否與您的自定義代碼有關。
嘗試添加chessBoard.setPreferredSize(600,600)來為電路板創建一個JPanel,它只有適合按鈕的空間(每個方向8個按鈕*按鈕單向75個尺寸)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.