我试图将按钮和文本字段添加到我的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中剩余的空间。
任何想法为什么?
答案 0 :(得分:0)
来自How to Use BoxLayout教程:
当BoxLayout从上到下布置组件时,它会尝试在组件的首选高度处调整每个组件的大小。如果布局的垂直空间与首选高度的总和不匹配,则 BoxLayout会尝试调整组件的大小以填充空间。组件会增大或缩小以填充空间,BoxLayout表示尊重每个组件的最小和最大尺寸。容器底部会出现任何额外的空间。
(强调我的)
显然,同样适用于水平框中的宽度。在我看来,上面应该是BoxLayout的实际javadoc,但它不是。
在您的情况下,最简单的解决方案是删除对setPreferredSize的显式调用,而是将每个JTextField的最大大小设置为与其首选大小相匹配:
searchBar.setMaximumSize(searchBar.getPreferredSize());
searchBar2.setMaximumSize(searchBar2.getPreferredSize());
BoxLayout尝试尊重最小和最大尺寸。