Java命令中断了组件填充
当我为带有GridBagLayout的JPanel中的每个项目设置边框颜色时,组件会崩溃 但是,当我仅从一个组件上移除边框时,填充将保持预期效果 我做错了什么 边框设置: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
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)));