在GridBagLayout Java GUI中删除按钮之间的空间?

时间:2017-04-23 01:35:34

标签: java swing jbutton gridbaglayout

这实在令人沮丧,特别是因为我认为它应该是一个简单的解决方案。我正在创建一个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的样子:

https://i.stack.imgur.com/BgH0f.png

1 个答案:

答案 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);

enter image description here

然而,这种事情的文档很稀疏,所以我不确定这实际上是多么合适。

设置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);
            }
        });
    }
}

这看起来相当不错:

enter image description here

说实话,我不确定这些选项中有多么强大,尽管我个人从来没有遇到任何问题。 documentation for plaf.basic有点不祥,但我已经看到了其他一些答案,说设置用户界面很好。问题是它是否会在众多平台上普遍运作,我不知道。