2017-08-01 20 views
0

JMenuBarがあり、その最後の要素(右端の1つ)がJMenuItemである場合、JMenuBarの残りの空き領域をすべて占有しますが、それは間違いなく私たちが望むものではありません。Swing - 最後のJMenuItemがJMenuBarの残りの領域を占める

JMenuBarの右端の項目として "About" JMenuItemを想像してください。それは他のメニューと同じスペースを占めるだけです。

私SSCCEを参照してください(メニューをクリックし、効果を確認するには、右側にメニュー項目の上にマウスを置く)

import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.SwingUtilities; 

public class JMenuItemLastOnMenuBar { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createGUI(); 
      } 
     }); 
    } 

    private static void createGUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.setBounds(0, 0, 300, 300); 

     JMenuBar bar = new JMenuBar(); 
     JMenu menu = new JMenu("Menu 1"); 
     JMenuItem item1 = new JMenuItem("Item 1"); 
     menu.add(item1); 
     bar.add(menu); 

     JMenuItem item2 = new JMenuItem("Item 2") { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(120, 25); 
      } 
     }; 
     bar.add(item2); 

     frame.setJMenuBar(bar); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

} 
+1

をオーバーライドする必要があります** **である理由'item2'の優先サイズを上書きするコードですか? –

+0

最後に区切り記号/スペーサーを追加する必要があります。 –

+0

@AndrewThompsonなぜなら、常にレイアウトマネージャーの適切な優先サイズを返すようにしたいからです。または、他の何か。 – FaithReaper

答えて

1

あなたは法にgetMaximumSize

import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.SwingUtilities; 

public class JMenuItemLastOnMenuBar { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createGUI(); 
      } 
     }); 
    } 

    private static void createGUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.setBounds(0, 0, 300, 300); 

     JMenuBar bar = new JMenuBar(); 
     JMenu menu = new JMenu("Menu 1"); 
     JMenuItem item1 = new JMenuItem("Item 1"); 
     menu.add(item1); 
     bar.add(menu); 

     JMenuItem item2 = new JMenuItem("Item 2") { 
      @Override 
      public Dimension getMaximumSize() { 
       Dimension d1 = super.getPreferredSize(); 
       Dimension d2 = super.getMaximumSize(); 
       d2.width = d1.width; 
       return d2; 
      } 
     }; 
     bar.add(item2); 

     frame.setJMenuBar(bar); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

} 
+0

これは機能します。今、JMenuItemははるかに小さく、制御可能です、ありがとう!今は無関係ですが、なぜJMenuBarのJMenuItemにホバーオーバーアニメーションがないのですか? – FaithReaper

+0

@FaithReaperあなたが使用しているL&Fでは実装されていません。一部のL&Fは、ホバーアニメーションをサポートしています(Windows L&Fを設定してください)(https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html)。 –

+0

@SergiyMendvynskyy私はチェックしたが動作していない。ホバーアニメーションは、メニューをクリックしてメニューのJMenuItemに一度ホバーすると表示されます。メニューを閉じると、2番目の項目にはアニメーションがありません。 – FaithReaper

関連する問題