2009-08-28 17 views
2

メニュー項目の最小幅を設定しようとしましたが、動作しません。ここにアイテムを作成する私の機能があります:JMenuItem setMinimumSizeが機能しない

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。私は&が

+1

ところで、 "iconPath ==" ""比較は機能しません。 – Bombe

+0

ああ、そうです:)。ありがとう!だから私は文字列comparasionはJavaで静的ではないことを忘れて、言語をスクリプトに使用します。 – stefita

+0

使用しているJavaのバージョンは?どのオペレーティングシステムを使用していますか?どのルックアンドフィールを使用していますか? –

答えて

4

ほとんどのレイアウトマネージャは、最小サイズと最大サイズを無視します。ここで任意のレイアウトマネージャに尊敬されるように、それらのサイズを強制的に便利な小さなトリックがある:

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

これはあっても、メニュー項目の変更の内容を作業するという利点があります。あなたの目的に合ったコンストラクタを追加する必要があります。

+0

これは良い回避策です!ありがとうございました! – stefita

1

を感じて見て、私は

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

であなたの

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

を交換し、それはそれあなたが探していた幅になり、システムを使用してWindows XP、サービスパック3にJDK1.6を使用していますために。私の経験では、スイングコンポーネントは最小サイズと最大サイズよりも好ましいサイズに反応します。

EDIT:

別の刺しを取った後、私は、これは...それはあなたが持っているのと同じくらいに帰着し、私はそれが何であなたがきたように、フォント(動作していないと思いますかなりうまく機能だと思いますフォントをハードコードする)。かなり長い間、それは違いを作るべきではありません本当に、それはしかし、アカウントにメニュー項目の主要なガターを取ることはありませんが、あなたがテキストでない限り

..

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

[OK]を、ので、私が見つかりました。解決策、おそらく最高のものではないが、それはうまくいくようだ。私はまだFontMetricsステートメントについて少し心配しています。誰かがより良い解決策を持っているなら、私はそれを見てうれしく思います。ここに私のコードは、(Menu.MINWIDTHは300から200とMenu.MAXWIDTHに設定されている)である。

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

のJMenuへフォントメトリックを使用する代わりに、フォント、テキスト、およびアイコンを使用して 'JLabel'を作成し、その優先サイズを取得することができます。 'JMenuItem'またはそれに近い値 –

+0

実際には、ここでメニュー項目を作成していることに気づいただけです。' JLabel'は必要なく、メニュー項目自身のオリジナルの好みのサイズを使うこともできますし、 Russ Haywardの回答のように –

0

あなたはフォントメトリックスを使用する必要がなぜ私はよく分からない質問を理解していれば。メニュー項目のgetPreferredSize()を呼び出すだけです。推奨サイズが最小サイズより小さい場合は、推奨サイズを最小値にリセットします。

+0

サイズは項目のテキストの長さによって異なるはずです。テキストが最小値よりも長い場合、メニュー項目の幅は変更できますが、最大値は変更されません。 – stefita

関連する問題