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,这是一个坏主意,因为所有已知的原因