我尝试为我的菜单项设置最小宽度,但它似乎不起作用。下面是我的函数,它创建项目:
private JMenuItem newItem(String text, String iconPath) {
JMenuItem myMenuItem;
if (iconPath == null || iconPath.isEmpty()) {
myMenuItem = new JMenuItem(text);
}
else {
ImageIcon icon = new ImageIcon(iconPath);
myMenuItem = new JMenuItem(text, icon);
}
// this would work, but then setMaximumSize doesn't have any effect
// myMenuItem.setPreferredSize(new Dimension(250,20));
myMenuItem.setMinimumSize(new Dimension(250,20));
myMenuItem.setMaximumSize(new Dimension(350,20));
return myMenuItem;
}我做错了什么?
PS。我在Windows XP Servicepack 3上使用jdk1.6和系统外观
发布于 2009-08-28 22:24:57
最小和最大尺寸被大多数布局管理器忽略。这里有一个有用的小技巧,它强制在任何布局管理器中遵守这些大小:
private class MyMenuItem extends JMenuItem {
@Override
public Dimension getPreferredSize() {
Dimension preferred = super.getPreferredSize();
Dimension minimum = getMinimumSize();
Dimension maximum = getMaximumSize();
preferred.width = Math.min(Math.max(preferred.width, minimum.width),
maximum.width);
preferred.height = Math.min(Math.max(preferred.height, minimum.height),
maximum.height);
return preferred;
}
}这样做的优点是即使菜单项的内容发生变化也能正常工作。您将需要添加构造器来满足您的目的。
发布于 2009-08-28 11:48:12
我替换了你的
myMenuItem.setMinimumSize(new Dimension(250, 20));
myMenuItem.setMaximumSize(new Dimension(350, 20));使用
myMenuItem.setPreferredSize(new Dimension(250, 20));它的宽度就是你想要的。根据我的经验,swing组件对首选大小的响应比对最小和最大大小的响应更好。
编辑:
再试一次之后,我认为这个效果很好..归根结底,它与您拥有的几乎相同,我认为无论使用哪种字体(因为您已经对字体进行了硬编码),它都能正常工作。
然而,它没有考虑菜单项的前导间隔,但是除非你的文本真的很长,否则它不应该有什么不同。
private JMenuItem newItem(String text, String iconPath) {
JMenuItem myMenuItem;
if (iconPath == null || iconPath.isEmpty()) {
myMenuItem = new JMenuItem(text);
myMenuItem.setPreferredSize(new Dimension(myMenuItem.getFontMetrics(myMenuItem.getFont()).stringWidth(text), 20));
} else {
ImageIcon icon = new ImageIcon(iconPath);
myMenuItem = new JMenuItem(text, icon);
myMenuItem.setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));
}
return myMenuItem;
}发布于 2009-08-28 13:40:33
好吧,所以我找到了一个解决方案,也许不是最好的,但它似乎是有效的。不过,我还是有点担心FontMetrics语句。因此,如果有人有更好的解决方案,我将很高兴看到它。下面是我的代码(Menu.MINWIDTH设置为200,Menu.MAXWIDTH设置为300):
private JMenuItem newItem(String text, String iconPath) {
JMenuItem myMenuItem;
ImageIcon icon= null;
int iconPixels = 0;
if (iconPath == null || iconPath.isEmpty()) {
myMenuItem = new JMenuItem(text);
}
else {
icon = new ImageIcon(iconPath);
myMenuItem = new JMenuItem(text, icon);
iconPixels = icon.getIconWidth();
}
FontMetrics fontM = myMenuItem.getFontMetrics(new Font("Default", Font.PLAIN, 12));
int stringPixels = fontM.stringWidth(text);
int newWidth = stringPixels + iconPixels;
newWidth = newWidth < Menu.MINWIDTH ? Menu.MINWIDTH : newWidth;
newWidth = newWidth > Menu.MAXWIDTH ? Menu.MAXWIDTH : newWidth;
myMenuItem.setPreferredSize(new Dimension(newWidth, 20));
System.out.println(text + " - " + newWidth);
return myMenuItem;
}https://stackoverflow.com/questions/1345902
复制相似问题