JTextField继续填充JMenuBar的空间

时间:2016-03-07 05:44:39

标签: java jmenubar

我试图将按钮和文本字段添加到我的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);

注意:jMenuBar1lblsearchtxtsearchbtnSearch是使用NetBeans创建的。

为了对此进行测试,我添加了另一个名为searchBar2的JTextField并设置了首选大小,但即使我添加了Box Glue,它们仍然占据了JMenuBar中剩余的空间。

任何想法为什么?

1 个答案:

答案 0 :(得分:0)

来自How to Use BoxLayout教程:

  

当BoxLayout从上到下布置组件时,它会尝试在组件的首选高度处调整每个组件的大小。如果布局的垂直空间与首选高度的总和不匹配,则 BoxLayout会尝试调整组件的大小以填充空间。组件会增大或缩小以填充空间,BoxLayout表示尊重每个组件的最小和最大尺寸。容器底部会出现任何额外的空间。

(强调我的)

显然,同样适用于水平框中的宽度。在我看来,上面应该是BoxLayout的实际javadoc,但它不是。

在您的情况下,最简单的解决方案是删除对setPreferredSize的显式调用,而是将每个JTextField的最大大小设置为与其首选大小相匹配:

searchBar.setMaximumSize(searchBar.getPreferredSize());
searchBar2.setMaximumSize(searchBar2.getPreferredSize());

BoxLayout尝试尊重最小和最大尺寸。