我正在尝试在JFrame中创建一个等间距的菜单。通过不相等的菜单,我的意思是菜单项的宽度随着我们放入该菜单的文本而变化。现在,我的菜单看起来像这样:
我希望我的菜单看起来像这样
我能这样做吗?我需要使用布局管理器来做到这一点吗?
答案 0 :(得分:2)
您还可以使用JToolBar
GridLayout(1, 0)
来获得均匀的间距。
答案 1 :(得分:2)
我是否需要使用布局管理器来执行此操作?
简短回答:是的: - )
更长的答案:菜单/ -bar有点特别之处在于某些layoutManagers不会像一个人那样(读:我)会期望。想到的最简单的是一行GridLayout:
// sanity check: does grid respect component alignment?
// manager does, but menu internal layout doesn't
JComponent content = new JPanel(new GridLayout(3, 3));
for (int i = 0; i < 9; i++) {
if (i % 2 == 0) {
JMenu menu = new JMenu("menu: " + i);
menu.setBorderPainted(true);
menu.setBorder(BorderFactory.createLineBorder(Color.GREEN));
menu.setHorizontalAlignment(JMenu.CENTER);
content.add(menu);
} else {
JLabel menu = new JLabel("label: " + i);
menu.setBorder(BorderFactory.createLineBorder(Color.GREEN));
menu.setHorizontalAlignment(JMenu.CENTER);
content.add(menu);
}
}
JXFrame frame = wrapInFrame(content, "menuBar with GridLayout");
JMenuBar bar = getMenuBar(frame);
// not surprisingly (after sanity check),
// horizontal align isn't respected in the menubar as well
bar.setLayout(new GridLayout(1, 0));
JMenu menu = new JMenu("some dummy");
menu.setBorderPainted(true);
menu.setBorder(BorderFactory.createLineBorder(Color.GREEN));
menu.setHorizontalAlignment(JMenu.CENTER);
bar.add(menu);
bar.add(new JMenu("other"));
show(frame, 500, 500);
完整性检查表明JMenu对于如何布局有自己的想法:内容始终是前导对齐的(确切的距离是LAF和is-或不是topLevelMenu)。这是在BasicMenuItem.paintMenuItem中使用MenuItemLayoutHelper在内部进行了硬编码。
因此,最简单的经理确实按照预期确定尺寸并找到它们,但是不能以个别项目为中心做任何事情。
如果需要居中,你可以使用技巧(不推荐,但[1]):基于实施细节
您可以在每个项目之前/之后添加胶水:
JMenu menu = new JMenu("some dummy");
menu.setBorderPainted(true);
menu.setBorder(BorderFactory.createLineBorder(Color.GREEN));
menu.setHorizontalAlignment(JMenu.CENTER);
bar.add(Box.createHorizontalGlue());
bar.add(menu);
bar.add(Box.createHorizontalGlue());
bar.add(new JMenu("other"));
bar.add(Box.createHorizontalGlue());
有了它,它们看起来居中并均匀分布在菜单栏宽度上:(可能,取决于要求)的缺点是菜单的大小是它们的pref,即不填满整个栏。
[1]同样的效果是干净利落的,不依赖于实施细节,有一个强大的马槽,如f.i. MigLayout
bar.setLayout(new MigLayout("fill, insets 0", "[center]"));
答案 2 :(得分:-1)
将每个菜单项的首选大小设置为相同。
jMenu1.setPreferredSize(new java.awt.Dimension(80, 21));
jMenu2.setPreferredSize(new java.awt.Dimension(80, 21));
jMenu3.setPreferredSize(new java.awt.Dimension(80, 21));