6
votes

Ajout d'un jmenuitem cliquable et de tir à l'action directement à un jmenubar?

Y a-t-il un moyen d'ajouter un objet jmenuitem (ou un objet de type bouton similaire) à un jmenubar?

Ajout d'un jmenuitem ne joue pas bien avec la mise en page d'un jmenubar et des boutons semblent trop de boutons.

Devrions-nous modifier le bouton pour ressembler à un jmenuitem ou modifier le jmenubar pour afficher correctement le jmenuitem? Ou autre chose d'autre?


0 commentaires

8 Réponses :


2
votes

jmenuitem ne joue pas bien avec le Disposition d'un jmenubar

Une menu-ménagère utilise un boxlayout qui essaiera de scrocher le composant à sa taille maximale. Essayez d'utiliser: xxx

Si vous avez besoin de plus d'aide Poster votre SSCCE montrant le problème.


1 commentaires

N'a pas travaillé pour moi, un espace blanc à gauche (où jmenuitem s espace de réserve pour icônes) est resté.



0
votes

Peut-être que vous oubliez votre jmenu. Vous devez mettre le jmenuitem dans un jmenu, puis vous ajoutez le jmenu au jmenubar.

Pour créer une barre de menu, vous devez faire quelque chose comme ce qui suit: P>

JMenuBar myBar = new JMenuBar();

JMenu fileMenu = new JMenu("File");

JMenuItem newFileMenuItem = new JMenuItem("New");
newFileMenuItem.addActionListener(new ActionListerner() { ... Define Action Handler here... });

fileMenu.add(newFileMenuItem);

myBar.add(fileMenu);


3 commentaires

Non, je n'oublie rien. Je suis bien conscient de la structure de Jmenubar, JMENU, JMENUITEM. Ma question était de savoir s'il y avait une façon de «sauter» JMENU et ajoutez un jmenuitem directement à un jmenubar. Merci quand même.


Je ne crois pas qu'il y ait, cela ressemble à ce que vous recherchez dans ce cas est un jtoolbar: Java.sun.com/javase/6/docs/api et non un jmenubar.


Essayez-vous de faire quelque chose comme les panneaux utilitaires Linux où vous pouvez avoir des liens d'alias avec des menus?



3
votes

Le code suivant implémente la solution de CamickR, bien que je voudrais avoir la même chose après avoir vu la manière par défaut jmenuitem code> s est rendue dans un jmenubar code>. Il semble raisonnablement authentique et répond aux clics, mais pas au mnémonique.

J'ai essayé de donner aux accélérateurs Jmenuitems (voir code) et cela fonctionne mais qui a l'air vraiment étrange. P>

public class TheDude19 extends JFrame {

   private class Action1 extends AbstractAction {
      private Action1() {
         super("Action1");
         putValue(MNEMONIC_KEY, (int) '1');
         // putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK));
      }
      public void actionPerformed(ActionEvent arg0) {
         System.out.println("Action 1!");
      }
   }
   private class Action2 extends AbstractAction {
      private Action2() {
         super("Action2");
         putValue(MNEMONIC_KEY, (int) '2');
      }
      public void actionPerformed(ActionEvent arg0) {
         System.out.println("Action 2!");
      }
   }
   private class NarrowMenuItem extends JMenuItem {

      public NarrowMenuItem(Action a) {
         super(a);
      }
      public Dimension getMaximumSize() {
         return new Dimension(super.getPreferredSize().width, super.getMaximumSize().height);
      }
   }
   public TheDude19() {
      JMenuItem menu1 = new NarrowMenuItem(new Action1());
      JMenuItem menu2 = new NarrowMenuItem(new Action2());
      JMenuBar mb = new JMenuBar();
      mb.add(menu1);
      mb.add(menu2);
      add(mb, BorderLayout.NORTH);
      setSize(400, 300);
   }

   public static void main(String[] args) {
      (new TheDude19()).setVisible(true);
   }

}


0 commentaires

0
votes

J'ai eu quelque chose comme ça que cela se produisait récemment, j'avais un jmenubar qui n'avait que 2 jmenuitems (alors noter que je n'ai pas essayé cela dans un environnement mixte JMENU et JMENUITEM.

Au début, j'ai fini de changer la mise en page une flowlayout avec un alignement gauche, mais qui a laissé trop d'espace entre les composants. Je me suis malade avec tentative de faire diverses choses, mais était très insatisfaite. Ce que j'ai fini par faire était d'utiliser un jmenu, mais en outre comportements de sorte qu'il prétendait être un jmenuitem. Comme ça? P>

    JMenuBar mainMenuBar = new JMenuBar();
    final JMenu quitMenuItem = new JMenu("Quit");
    quitMenuItem.addMenuListener(new MenuListener() {
        public void menuSelected(MenuEvent e) {
            System.exit(0);

        }
        public void menuDeselected(MenuEvent e) {}
        public void menuCanceled(MenuEvent e) {}
    });

    quitMenuItem.setPopupMenuVisible(false);
    final JMenu aboutMenuItem = new JMenu("About");

    aboutMenuItem.addMenuListener(new MenuListener() {
        public void menuSelected(MenuEvent e) {
            JOptionPane.showMessageDialog(MainFrame.this, "Assignment 3 With Swing UI. Author: T.Byrne", "About", JOptionPane.INFORMATION_MESSAGE);
            aboutMenuItem.setSelected(false);//otherwise it will still be selected after the dialog box.  
        }
        public void menuDeselected(MenuEvent e) {}

        public void menuCanceled(MenuEvent e) {}
    });
    aboutMenuItem.setPopupMenuVisible(false);
    mainMenuBar.add(quitMenuItem);
    mainMenuBar.add(aboutMenuItem);
    this.setJMenuBar(mainMenuBar);


1 commentaires

Le problème est que l'événement menusélecté peut être tiré sans cliquer sur le menu. Vous n'avez pas remarqué cela parce que vous n'avez pas de menus réguliers dans votre barre de menus. Si vous cliquez sur un menu régulier pour développer son menu contextuel, puis passez à un autre menu, celui-ci sera automatiquement sélectionné et il est développé. Si vous passez sur votre menu spécial, vous quitterez votre application simplement en volant votre souris dessus, sans cliquer dessus.



0
votes

yup. Ou faites-le la voie facile xxx

Cela crée un fichier de classe, mais meh.


0 commentaires

1
votes

Il suffit de modifier le jbutton.

button= new JButton("MenuItem");
button.setOpaque(true);
button.setContentAreaFilled(false);
button.setBorderPainted(false);
button.setFocusable(false);
button.addActionListener(new buttonHandler());
menuBar.add(button);


0 commentaires

0
votes

Pour obtenir le bouton pour ressembler à un jmenu, ajoutez simplement un effet de roulement et retirez la bordure du bouton (voir le code ci-dessous par exemple)

Importations requises P>

JButton tstButton = new JButton();
tstButton.setVisible(false);
tstButton.addActionListener(new CustomActionListener());

menuBar.add(tstButton);

JMenu menuButton = new JMenu();
addHotKey(menuButton, "shift C", 'm', "Menu Button","pressed");
menuButton.addMouseListener(new CustomMouseListener());
menuButton.addMenuKeyListener(new CustomKeyListener());

menuBar.add(menuButton);

public void addHotKey(JMenu J, String s, char c, String S, String key)
{
    Action buttonAction = new AbstractAction(S) 
    {
        @Override
        public void actionPerformed(ActionEvent evt) 
        {
            clcikComponent(tstButton);
        }
    };

    J.setAction(buttonAction);

    buttonAction.putValue(Action.MNEMONIC_KEY, KeyEvent.getExtendedKeyCodeForChar(c));

    J.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
    KeyStroke.getKeyStroke(s), key);

    J.getActionMap().put(key, buttonAction);
}

class CustomMouseListener implements MouseListener
{
    public void mouseClicked(MouseEvent e) 
    {
        clcikComponent(m_Invisible);
    }

    public void mousePressed(MouseEvent e){}

    public void mouseReleased(MouseEvent e){}

    public void mouseEntered(MouseEvent e){}

    public void mouseExited(MouseEvent e){}
}

class CustomKeyListener implements MenuKeyListener
{
    @Override
    public void menuKeyTyped(MenuKeyEvent e)
    {
        char c = e.getKeyChar();
        if(c==KeyEvent.VK_ENTER)
        {
            if(m_code.isSelected())
            {
                clcikComponent(m_Invisible);
            }
        }
    }

    @Override
    public void menuKeyPressed(MenuKeyEvent e){}

    @Override
    public void menuKeyReleased(MenuKeyEvent e){}
}

public void clcikComponent(JButton comp)
{
    comp.doClick();
}

class CustomActionListener implements ActionListener
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        //Makes Button Perform Action
    }
}


0 commentaires

0
votes

Obtenir l'interface utilisateur et le code des deux pour bien paraître a pris un certain temps. Nous avons fini par attacher une adaptateur de souris au composant sous-jacent de JMENU:

JMenu selectData = new JMenu("Select data...");

selectData.getComponent().addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
        // Our code to open a window for choosing data series here...
        // [...]
    }
});

menuBar.add(selectData);


0 commentaires