我试图将按钮和文本字段添加到我的jMenuBar中,即使在我设置了JTextField的PreferredSize之后,JTextField仍然继续填充我的JMenuBar上的空间。
注意:此JMenuBar是使用此方法添加的-
public static void setJPanelMenuBar(JPanel parent, JPanel child, JMenuBar menuBar) {
parent.removeAll();
parent.setLayout(new BorderLayout());
JRootPane root = new JRootPane();
parent.add(root, BorderLayout.CENTER);
root.setJMenuBar(menuBar);
root.getContentPane().add(child);
parent.putClientProperty("root", root); //if you need later
}
该代码允许我在 JPanel 中添加一个 JMenuBar。
现在进入JMenuBar代码。
JMenuBar x = jMenuBar1;
x.removeAll();
JTextField searchBar = txtsearch;
JTextField searchBar2 = new JTextField();
searchBar2.setPreferredSize(new Dimension(10,20));
x.add(lblsearch);
x.add(searchBar);
x.add(btnSearch);
x.add(Box.createHorizontalGlue());
x.add(searchBar2);
注意:jMenuBar1
、lblsearch
、txtsearch
和btnSearch
是使用 NetBeans 创建的。
为了测试这一点,我添加了另一个名为 searchBar2
的 JTextField 并设置了首选大小,但即使在我添加了 Box Glue 之后,两者都会继续占用 JMenuBar 中剩余的空间。
任何想法为什么?
来自如何使用 BoxLayout 教程:
当 BoxLayout 从上到下布置组件时,它会尝试按组件的首选高度调整每个组件的大小。如果布局的垂直空间与首选高度的总和不匹配,则 BoxLayout 会尝试调整组件的大小以填充空间。组件要么增大,要么缩小以填充空间,BoxLayout 遵循每个组件的最小和最大大小。任何额外的空间都会显示在容器的底部。
(强调我的)
显然,这同样适用于水平框中的宽度。 在我看来,以上应该在BoxLayout的实际javadoc中,但事实并非如此。
在您的情况下,最简单的解决方案是删除对 setPreferredSize 的显式调用,而是设置每个 JTextField 的最大大小以匹配其首选大小:
searchBar.setMaximumSize(searchBar.getPreferredSize());
searchBar2.setMaximumSize(searchBar2.getPreferredSize());
BoxLayout 尝试遵循最小和最大大小。