2

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

折叠

但是当我只删除一个组件的边框时,填充保持不变。

普通的

我究竟做错了什么?

边框设置:

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

面板:

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

4 回答 4

4

我不确定它是如何影响GridBagLayout的,但是“一般来说,当您想在JPanelor以外的标准 Swing 组件上设置边框时JLabel,我们建议您将组件放在 a 中JPanel并在 . 上设置边框JPanel。”—<一个 href="http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#setBorder%28javax.swing.border.Border%29" rel="nofollow noreferrer"> setBorder()这里有一个相关的例子。

于 2012-08-01T18:48:11.293 回答
2

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

System.out.println(addMachineBtn.getBorder());在 addMachineBtn 创建后插入。你会看到边界已经存在

javax.swing.plaf.BorderUIResource$CompoundBorderUIResource

此边框为组件提供了自己的插图,当您将边框替换为另一个时,您会丢失其插图。

于 2012-08-01T20:42:46.523 回答
1

如果保留原始组件的 insets 和替换边框确实很重要,请尝试模仿原生的 Swing 边框。

例如这样的:

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

而不是 LineBorder 放置您需要的边框,EmptyBorder 保持不变,只是根据需要更正插入。

于 2012-08-01T21:15:57.877 回答
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));
于 2012-08-01T20:43:43.083 回答