Java命令中断了组件填充

Java命令中断了组件填充,java,swing,border,collapse,gridbaglayout,Java,Swing,Border,Collapse,Gridbaglayout,当我为带有GridBagLayout的JPanel中的每个项目设置边框颜色时,组件会崩溃 但是,当我仅从一个组件上移除边框时,填充将保持预期效果 我做错了什么 边框设置: setBorder(BorderFactory.createLineBorder(Color.decode("#"+Constants.Display.OPTIONS_BORDER_COLOR))); JPanel: public class OptionsPanel extends JPanel { p

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

但是,当我仅从一个组件上移除边框时,填充将保持预期效果

我做错了什么

边框设置:

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

我不确定它会如何影响
GridBagLayout
,但“一般来说,当您想要在标准Swing组件上设置边框而不是
JPanel
JLabel
,我们建议您将组件放在
JPanel
中,并在
JPanel
上设置边框”。有一个相关的例子。

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

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

javax.swing.plaf.BorderUIResource$CompoundBorderUIResource

此边框为组件提供了自己的插图,当您用另一个边框替换边框时,会松开其插图

对此的修复正在更改以下内容

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


如果保留原始组件插入并替换边框真的很重要,请尝试模仿本机Swing边框

例如,类似这样的事情:

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

与LineBorder不同的是,EmptyByOrder保持不变,只需根据需要更正插入即可。

AFAICS,您可以使用布局管理器设置大小。让
LayoutManager
考虑每个组件的大小。不要在代码中显式地添加像
setPreferredSize(…)
这样的行,这属于布局问题。让它来处理这件事。@GagandeepBali这是Spart。。。呃,这是
GridBagLayout
。您不仅必须设置
preferredSize
s以使控件不在屏幕上随机跳转,而且无法保证设置的大小会得到遵守。对
GridBagLayout
问题的唯一回应是:如果您的项目允许,请使用。除此之外,
miglaway
因尊重首选尺寸而臭名昭著,而
gridbaglaway
则不然。@pafauk:恕我直言,
GridBagLayout
完全是关于使用
weightx/weighty
设置大小,而不是明确定义
setPreferredSize()
。这两个约束负责提供与所需内容相关的大小,而不是相反。这里是一个,使用约束。sePreferredSize在添加setboorder之前可以正常工作。必须有一种方法来更改组件上的边框,而不仅仅是在组件周围添加一个额外的边框。@nest或者根本的问题。下面是解决方法。一个常见的异常是,在具有不同字体度量的平台上,文本被截断/未对齐。
addMachineBtn.setBorder(new CompoundBorder(new LineBorder(Color.red), new EmptyBorder(5, 17, 5, 17)));