当我使用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);
}
}
答案 0 :(得分:4)
我不确定它会如何影响GridBagLayout
,但是“一般情况下,当你想在JPanel
或JLabel
以外的标准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));