在Swing中创建等间距菜单

时间:2012-09-19 05:08:09

标签: java swing user-interface

我正在尝试在JFrame中创建一个等间距的菜单。通过不相等的菜单,我的意思是菜单项的宽度随着我们放入该菜单的文本而变化。现在,我的菜单看起来像这样:



我希望我的菜单看起来像这样


enter image description here


我能这样做吗?我需要使用布局管理器来做到这一点吗?

3 个答案:

答案 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]):基于实施细节

  • 默认的layoutManger是-BoxLayout和
  • topLevelMenu有一个maxSize == prefSize

您可以在每个项目之前/之后添加胶水:

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));