我正在努力用Java构建一个国际象棋游戏,我目前在使用Swing完全按照我想要的方式获取GUI时遇到了一些麻烦。我正在使用GridLayout
来组织一个8x8 ChessButton
的网格(覆盖JButton
,以便我可以在其中存储额外的信息,例如坐标)。最初,ChessButton
s不会出现,除非我对它们进行了摩擦,但我通过将每个ChessButton
放在单独的JPanel
中并将每个按钮的setPreferredSize()
设置为来解决了这个问题设定的高度和宽度。
现在,我的问题是每个按钮上方(和/或下方?)似乎有一个小的边距或填充。我已确保为setHgap(0)
设置setVgap(0)
和GridLayout
,因此我很确定神秘的边距来自按钮或JPanel
。但是,我似乎无法摆脱它们,而且每当我抓住它们时,它们似乎会导致每个ChessButton
向上/向下移动一点。
我意识到这个问题的描述可能有点难以想象,所以我拍了一张截图(使用JButton
而不是ChessButton
s,因此差距更容易识别) :http://img3.imageshack.us/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比较新,所以如果答案非常明显,我很抱歉,但我很感激任何人可能提供的任何帮助!提前谢谢!
答案 0 :(得分:16)
不要添加空边框;请使用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();
}
});
}
}
答案 1 :(得分:3)
最初,ChessButtons不会出现,除非我将它们放在上面,但我通过将每个ChessButton放在一个单独的JPanel中并将每个按钮的setPreferredSize()设置为设定的高度和宽度来解决这个问题
这不是正确的解决方案。没有理由使用JPanel来按住按钮。事实上,这可能是问题的原因。将它们添加到GridLayout时,按钮应显示。如果它们没有显示它可能是因为您在使GUI可见后将按钮添加到GUI。组件应该在显示之前添加到GUI中。
现在,我的问题是每个按钮上方(和/或下方?)似乎有一个小的边距或填充
我不明白为什么也没有横向差距。创建JPanel时,默认情况下它使用FlowLayout,它还包含5像素的水平/垂直间隙。所以我理解为什么你可能有10像素的垂直间隙。我不明白为什么没有横向差距。
如果您需要更多帮助,请发布SSCCE来证明问题。 SSCCE应该使用常规的JButton。在开始使用自定义组件之前,先了解使用标准组件的基础知识。这样您就知道问题是否与您的自定义代码有关。
答案 2 :(得分:1)
尝试添加chessBoard.setPreferredSize(600,600)为棋盘创建一个JPanel,它只有适合按钮的空间(每个方向8个按钮*按钮单向75个尺寸)。