这实在令人沮丧,特别是因为我认为它应该是一个简单的解决方案。我正在创建一个JButtons网格,我试图摆脱按钮之间的空间。我尝试过从GridLayout到GridBagLayout,我还添加了约束。我试过搞乱填充,插入,网格宽度和网格高度。当我使用GridLayout时,我打印出组件的hgap和vgap,它们都是零。我一直在看GridBagLayout和GridLayout的教程,我不确定我错过了什么。
JPanel middle = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
for (int i = 0; i < buttons.length; i++) {
c.gridy = i;
for (int j = 0; j < buttons[i].length; j++) {
c.gridx = j;
buttons[i][j] = new JButton("");
buttons[i][j].setPreferredSize(new Dimension(60, 90));
middle.add(buttons[i][j], c);
//buttons[i][j].addActionListener(new ButtonListener());
}
}
这就是GUI的样子:
答案 0 :(得分:1)
与评论中的其他人一样,这是按钮UI本身的问题。
如果您想将它们紧密地放在一起,还有一些其他UI更加方正,例如:
buttons[i][j].setUI(new javax.swing.plaf.basic.BasicButtonUI());
Border b = new javax.swing.plaf.basic.BasicBorders.ButtonBorder(
Color.gray, Color.darkGray, Color.gray, Color.lightGray);
buttons[i][j].setBorder(b);
buttons[i][j].setBackground(Color.white);
然而,这种事情的文档很稀疏,所以我不确定这实际上是多么合适。
设置UI的另一种方法是通过UI管理器,它可以全面设置UI:
UIManager.put("ButtonUI", "javax.swing.plaf.basic.BasicButtonUI");
除了设置UI之外,您还可以手动编写自定义外观,方法是设置边框并将侦听器编写为所有交互的帐户。这是一个例子:
class CompactButton extends JButton {
Border pressed = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
Border released = BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
Border highlight = BorderFactory.createLineBorder(new Color(0xADD8E6), 2);
Border focused = BorderFactory.createCompoundBorder(released, highlight);
void setPressed(boolean isPressed) {
if (isPressed) {
setBorder(pressed);
setBackground(Color.lightGray);
} else {
setBorder(released);
setBackground(Color.white);
}
}
CompactButton() {
setBorder(released);
setOpaque(true);
setBackground(Color.white);
addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
setPressed(getModel().isPressed());
}
});
addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
setBorder(focused);
}
@Override
public void focusLost(FocusEvent e) {
setBorder(released);
}
});
}
}
这看起来相当不错:
说实话,我不确定这些选项中有多么强大,尽管我个人从来没有遇到任何问题。 documentation for plaf.basic
有点不祥,但我已经看到了其他一些答案,说设置用户界面很好。问题是它是否会在众多平台上普遍运作,我不知道。