Java setBorder打破了组件填充

时间:2012-08-01 18:17:27

标签: java swing border collapse gridbaglayout

当我使用GridBagLayout为JPanel中的每个项目设置边框颜色时,组件会崩溃。

Collapsed

但是当我从一个组件中移除边框时,填充按预期保持。

Normal

我做错了什么?

边框设置:

    setBorder(BorderFactory.createLineBorder(Color.decode("#"+Constants.Display.OPTIONS_BORDER_COLOR)));

的JPanel:

public class OptionsPanel extends JPanel {
    private AddMachineBtn addMachineBtn;
    private SearchField searchField;
    private SearchBtn searchBtn;

    private GridBagConstraints gbc;

    public OptionsPanel() {
        init();
        config();
        build();
    }

    private void init() {
        addMachineBtn = new AddMachineBtn("Add Machine");
        searchField = new SearchField("Search...");
        searchBtn = new SearchBtn("S");

        gbc = new GridBagConstraints();
        int i = Constants.Display.OPTIONS_PANEL_PADDING;
        gbc.insets = new Insets(i, i, i, i);
    }

    private void config() {
        setLayout(new GridBagLayout());
        setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.decode("#"+Constants.Display.OPTIONS_BORDER_COLOR)));
        setPreferredSize(new Dimension(0, Constants.Display.OPTIONS_PANEL_HEIGHT));
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.anchor = gbc.LINE_START;
    }

    private void build() {
        gbc.gridx = 0;
        add(addMachineBtn, gbc);

        gbc.weightx = 0;
        gbc.gridx = 1;
        add(searchField, gbc);

        gbc.gridx = 2;
        add(searchBtn, gbc);
    }
}

4 个答案:

答案 0 :(得分:4)

我不确定它会如何影响GridBagLayout,但是“一般情况下,当你想在JPanelJLabel以外的标准Swing组件上设置边框时,我们建议您将该组件放在JPanel中,并在JPanel上设置边框。“ - setBorder()。有一个相关的例子here

答案 1 :(得分:2)

是的,布局对组件的大小没有影响。您可以尝试更改布局(例如更改为FlowLayout),但情况将相同。 Swing组件在初始化期间从Look'n'Feel获得其边框。

创建addMachineBtn后插入System.out.println(addMachineBtn.getBorder());。您将看到边框已存在

javax.swing.plaf.BorderUIResource$CompoundBorderUIResource

这个边框为组件提供了自己的插图,当你用另一个边框替换边框时,你会松开它的插图。

答案 2 :(得分:1)

如果保持原始组件插入并替换边框非常重要,请尝试模仿原生Swing边框。

例如:

addMachineBtn.setBorder(new CompoundBorder(new LineBorder(Color.red), new EmptyBorder(5, 17, 5, 17)));

而不是LineBorder把边框放到你需要的东西,EmptyBorder保持不变,只需要根据需要纠正插入。

答案 3 :(得分:0)

对此的修正正在改变以下

setSize(new Dimension(w,h));
setMinimumSize(new Dimension(w,h));
setMaximumSize(new Dimension(w,h));

setPreferredSize(new Dimension(w,h));
setMinimumSize(new Dimension(w,h));
setMaximumSize(new Dimension(w,h));