Java 在JMenuBar中调整JTextField的大小

Java 在JMenuBar中调整JTextField的大小,java,swing,jtextfield,layout-manager,preferredsize,Java,Swing,Jtextfield,Layout Manager,Preferredsize,我正在尝试将JTextField作为搜索栏添加到JMenuBar的JFrame顶部。我的问题是JTextField不断调整大小以占用JMenuBar中的所有可用空间,我不希望它这样做。我尝试了setPreferredSize()和setMaximum Size(),但这些都不起作用,可能是因为JMenuBar中使用的LayoutManager不考虑这些大小。我还尝试使用FlowLayout将JTextField添加到JPanel,并将面板添加到JMenuBar,但我得到的结果如下: 面板位于JM

我正在尝试将
JTextField
作为搜索栏添加到
JMenuBar
JFrame
顶部。我的问题是
JTextField
不断调整大小以占用
JMenuBar
中的所有可用空间,我不希望它这样做。我尝试了
setPreferredSize()
setMaximum Size()
,但这些都不起作用,可能是因为
JMenuBar
中使用的
LayoutManager
不考虑这些大小。我还尝试使用
FlowLayout
JTextField
添加到
JPanel
,并将面板添加到
JMenuBar
,但我得到的结果如下:

面板位于
JMenuBar
的右侧,大小似乎正确,但除了这个奇怪的蓝色条外,我看不到任何东西

以下是(我认为)相关的代码。如果需要更多,请告诉我:

       JPanel searchPanel = new JPanel();
    searchPanel.setPreferredSize(new Dimension(100, 25));


    JTextField searchBar = new JTextField(50);

    String[] fields = {"title", "author", "subject", "publisher", "year", "circulating", "catalog" };


    JComboBox searchFields = new JComboBox(fields);

    JButton searchBtn = new JButton("search");

    searchPanel.add(searchBar);
    searchPanel.add(searchFields);
    searchPanel.add(searchBtn);
    searchPanel.setVisible(true);

    fileMenu.add(open);
    fileMenu.add(save);
    fileMenu.add(exit);

    libMenu.add(viewLib);
    libMenu.addSeparator();
    libMenu.add(newBook);
    libMenu.add(search);

    this.setJMenuBar(topBar);
       topBar.add(fileMenu);
    topBar.add(libMenu);
    topBar.add(Box.createHorizontalGlue());
   topBar.add(searchPanel);
这对我有用

menuBar.add(Box.createHorizontalGlue());
JTextField textField = new JTextField(10);
textField.setMaximumSize( textField.getPreferredSize() );
menuBar.add(textField);
如果需要更多帮助,请发布SSCCE

编辑:

同样,发布代码只是为了表明问题在于包含文本字段的最大大小。你如何选择这样做取决于你自己

这对我很有用

menuBar.add(Box.createHorizontalGlue());
JTextField textField = new JTextField(10);
textField.setMaximumSize( textField.getPreferredSize() );
menuBar.add(textField);
如果需要更多帮助,请发布SSCCE

编辑:


同样,发布代码只是为了表明问题在于包含文本字段的最大大小。你如何选择这样做取决于你自己

我的解决方案与camickr的类似,但不需要setMaximumSize()。并不是说我反对它,但我知道有狂热者,所以他们发誓“永远不要调用setXxxsize()!!”我不是他们中的一员,但他们在那里

无论如何,我会用GridBagLayout创建一个JPanel,并将JTextField填充为NONE,将Box.createHorizontalGlue()填充为HORIZONTAL。然后,将此面板放在菜单栏中

编辑:

为了完整起见,这里有一个使用JPanel新/o的解决方案,它必须调用setMaximumSize(…)
(因此避免在地狱中永远燃烧……根据一些人的说法):

一些评论:
1) 伙计,我忘了GBL有多冗长了。通常我使用一个帮助器类来大大减少代码,但我不想为这样一个小示例发布它

2) 如果走面板路线,camickr关于使用BorderLayout的建议(见下面的评论)不仅有效,而且代码简单得多


3) 此外,正如camickr指出的,使用面板会影响“粘合”区域的外观。它被描绘成一个JPanel而不是一个JMenuBar。老实说,在他提到之前,我甚至没有在我的机器上注意到它(使用金属L&F),但它是不同的,可能是不希望的副作用。

我的解决方案与camickr的类似,但不需要设置MaximumSize()。并不是说我反对它,但我知道有狂热者,所以他们发誓“永远不要调用setXxxsize()!!”我不是他们中的一员,但他们在那里

无论如何,我会用GridBagLayout创建一个JPanel,并将JTextField填充为NONE,将Box.createHorizontalGlue()填充为HORIZONTAL。然后,将此面板放在菜单栏中

编辑:

为了完整起见,这里有一个使用JPanel新/o的解决方案,它必须调用setMaximumSize(…)
(因此避免在地狱中永远燃烧……根据一些人的说法):

一些评论:
1) 伙计,我忘了GBL有多冗长了。通常我使用一个帮助器类来大大减少代码,但我不想为这样一个小示例发布它

2) 如果走面板路线,camickr关于使用BorderLayout的建议(见下面的评论)不仅有效,而且代码简单得多


3) 此外,正如camickr指出的,使用面板会影响“粘合”区域的外观。它被描绘成一个JPanel而不是一个JMenuBar。老实说,在他提到之前,我甚至没有在我的机器上注意到它(使用金属L&F),但它是不同的,可能是一个不希望的副作用。

JMenuBar有自己的布局管理器,它可能会忽略您的尺寸提示是的,我知道,但这里肯定有解决办法。看起来我发布的(将JTextField等添加到JPanel中)会起作用,但是JPanel没有正确显示,这是我真正不了解的,
JPanel
将受到与
JTextField
相同的限制……抱歉,需要一些思考空间;),对于@splungebob,它从来都不符合至少第二个近似值,这非常接近实际值:-)事实上,我不记得见过一个用例(在实际应用中,而不是在快速示例中)在这些年里,它没有引发比它应该解决的问题更多的问题。
JMenuBar
有自己的布局管理器,它可能会忽略你的尺寸提示是的,我知道,但肯定有解决办法。看起来我发布的(将JTextField等添加到JPanel中)会起作用,但是JPanel没有正确显示,这是我真正不了解的,
JPanel
将受到与
JTextField
相同的限制……抱歉,需要一些思考空间;),对于@splungebob,它从来都不符合至少第二个近似值,这非常接近实际值:-)事实上,我不记得见过一个用例(在实际应用中,而不是在快速示例中)在这些年里,它没有引发比它应该解决的问题更多的问题。+1用于依赖。有趣的是,它起了作用。这与我之前的代码完全相同,只是我在代码的前面创建了JTextField,并在创建horizontalglue后将其添加到菜单栏中。出于某种原因,在创建胶水后创建并添加它使其工作。有人能解释为什么会这样吗。。。这仍然是将max硬编码为当前pref,这是一个坏主意,因为所有已知的原因