Java 在Swing中创建等距菜单

Java 在Swing中创建等距菜单,java,swing,user-interface,Java,Swing,User Interface,我试图在JFrame中创建一个等间距的菜单。所谓不等间距菜单,我的意思是菜单项的宽度随我们放入该菜单的文本而变化。现在,我的菜单如下所示: 我想让我的菜单看起来像这样 我可以这样做吗?我需要使用布局管理器来完成吗 将每个菜单项上的首选大小设置为相同 jMenu1.setPreferredSize(new java.awt.Dimension(80, 21)); jMenu2.setPreferredSize(new java.awt.Dimension(80, 21)); jMenu

我试图在JFrame中创建一个等间距的菜单。所谓不等间距菜单,我的意思是菜单项的宽度随我们放入该菜单的文本而变化。现在,我的菜单如下所示:



我想让我的菜单看起来像这样




我可以这样做吗?我需要使用布局管理器来完成吗

将每个菜单项上的首选大小设置为相同

jMenu1.setPreferredSize(new java.awt.Dimension(80, 21));
jMenu2.setPreferredSize(new java.awt.Dimension(80, 21));
jMenu3.setPreferredSize(new java.awt.Dimension(80, 21));
您还可以使用带有
GridLayout(1,0)

我需要使用布局管理器来完成吗

简短回答:是:-)

更详细的回答:菜单/-栏有点特别,因为一些布局经理并没有按照他们(读:我)的期望去做。想到的最简单的是一行网格布局:

// 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);
这样,它们看起来居中且均匀地分布在菜单栏的宽度上:缺点是(可能是,取决于需求)菜单的大小取决于它们的优先级,即不会填满整个栏

[1] 同样的效果也可以干净地实现,不需要依赖于实现细节,并且有一个足够强大的管理器,比如f.i.MigLayout

bar.setLayout(new MigLayout("fill, insets 0", "[center]"));

如果菜单字体大小改变怎么办??如果文本较大,那么80px?好的。。成功了。我也可以在该空间内设置文本对齐方式,比如将其放置在空间的中心或右侧吗?不,不管有什么问题,setXXSize不是答案+1对于JToolBar(尽管需求似乎是一个菜单栏,但这可能是一个可行的替代方案)
bar.setLayout(new MigLayout("fill, insets 0", "[center]"));