代码之家  ›  专栏  ›  技术社区  ›  stefita

jmenuitem setminimumsize不起作用

  •  2
  • stefita  · 技术社区  · 15 年前

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

     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上使用JDK1.6,ServicePack 3,具有系统外观

    4 回复  |  直到 15 年前
        1
  •  4
  •   Russ Hayward    15 年前

    大多数布局管理器忽略最小和最大大小。下面是一个有用的小技巧,它强制在任何布局管理器中都尊重这些大小:

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

    即使菜单项的内容发生更改,这也具有工作的优势。您需要添加构造器以满足您的目的。

        2
  •  1
  •   Nico    15 年前

    我取代了你

    myMenuItem.setMinimumSize(new Dimension(250, 20));
    myMenuItem.setMaximumSize(new Dimension(350, 20));
    

    具有

    myMenuItem.setPreferredSize(new Dimension(250, 20));
    

    它使它成为你想要的宽度。根据我的经验,回转组件比最小和最大尺寸对首选尺寸的响应更好。

    编辑:

    再捅一刀后,我觉得这个很管用。归根结底,它与您拥有的几乎相同,我认为它将工作,无论什么字体(在哪里,因为您已经硬编码的字体)。

    但是,它不考虑菜单项的前边空白,但是除非文本非常长,否则它不应该有什么区别。

     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;
    }
    
        3
  •  0
  •   stefita    15 年前

    好吧,所以我找到了一个解决方案,也许不是最好的,但它似乎有效。不过,我还是有点担心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;
     }
    
        4
  •  0
  •   camickr    15 年前

    如果我理解这个问题,我不知道为什么需要使用fontmetrics。只需在菜单项上调用getPreferredSize()。如果首选大小小于最小值,则将首选大小重置为最小值。