首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMenuItem setMinimumSize不工作

JMenuItem setMinimumSize不工作
EN

Stack Overflow用户
提问于 2009-08-28 09:18:41
回答 4查看 5.1K关注 0票数 2

我尝试为我的菜单项设置最小宽度,但它似乎不起作用。下面是我的函数,它创建项目:

代码语言:javascript
复制
 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和系统外观

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-28 22:24:57

最小和最大尺寸被大多数布局管理器忽略。这里有一个有用的小技巧,它强制在任何布局管理器中遵守这些大小:

代码语言:javascript
复制
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;
    }
}

这样做的优点是即使菜单项的内容发生变化也能正常工作。您将需要添加构造器来满足您的目的。

票数 4
EN

Stack Overflow用户

发布于 2009-08-28 11:48:12

我替换了你的

代码语言:javascript
复制
myMenuItem.setMinimumSize(new Dimension(250, 20));
myMenuItem.setMaximumSize(new Dimension(350, 20));

使用

代码语言:javascript
复制
myMenuItem.setPreferredSize(new Dimension(250, 20));

它的宽度就是你想要的。根据我的经验,swing组件对首选大小的响应比对最小和最大大小的响应更好。

编辑:

再试一次之后,我认为这个效果很好..归根结底,它与您拥有的几乎相同,我认为无论使用哪种字体(因为您已经对字体进行了硬编码),它都能正常工作。

然而,它没有考虑菜单项的前导间隔,但是除非你的文本真的很长,否则它不应该有什么不同。

代码语言:javascript
复制
 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;
}
票数 1
EN

Stack Overflow用户

发布于 2009-08-28 13:40:33

好吧,所以我找到了一个解决方案,也许不是最好的,但它似乎是有效的。不过,我还是有点担心FontMetrics语句。因此,如果有人有更好的解决方案,我将很高兴看到它。下面是我的代码(Menu.MINWIDTH设置为200,Menu.MAXWIDTH设置为300):

代码语言:javascript
复制
 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;
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1345902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档