Java 在Swing中创建等距菜单
我试图在JFrame中创建一个等间距的菜单。所谓不等间距菜单,我的意思是菜单项的宽度随我们放入该菜单的文本而变化。现在,我的菜单如下所示: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
我想让我的菜单看起来像这样
我可以这样做吗?我需要使用布局管理器来完成吗 将每个菜单项上的首选大小设置为相同
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]"));