2017-08-01 3 views
0

Je trouve que si j'ai un JMenuBar, et le dernier élément de celui-ci (le plus à droite) est un JMenuItem, il occupera tout l'espace vide restant sur le JMenuBar, ce qui n'est certainement pas ce que nous voulons. Imaginez un élément JMenuItem "About" en tant qu'élément le plus à droite sur un JMenuBar. Il ne devrait occuper que le même espace que les autres menus.Swing - dernier JMenuItem occupe le reste de l'espace sur JMenuBar

Voir mon SSCCE: (cliquez sur le menu et survolez la menuitem à droite pour voir l'effet)

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

** Pourquoi ** est le code remplaçant la taille préférée de 'item2'? –

+0

Vous devez ajouter un séparateur/espaceur à la fin ... –

+0

@AndrewThompson parce que je veux le rendre toujours une taille préférée pour le gestionnaire de disposition à utiliser. Ou autre chose. – FaithReaper

Répondre

1

Vous devez remplacer la méthode 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

Cela fonctionne. Maintenant, le JMenuItem est beaucoup plus petit et contrôlable, merci! Maintenant, ce n'est pas pertinent, mais pourquoi le JMenuItem sur le JMenuBar n'a pas d'animation survolée? – FaithReaper

+0

@FaithReaper n'est pas implémenté dans le L & F que vous utilisez. Certains L & F prennent en charge l'animation de survol (essayez de [définir Windows L & F] (https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html)). –

+0

@SergiyMendvynskyy J'ai vérifié mais cela ne fonctionne pas. L'animation de survol est montrée seulement après que je clique sur le menu et planez sur le JMenuItem dans le menu une fois. Si je ferme le menu, le deuxième élément n'a aucune animation. – FaithReaper