Frage

Ich habe versucht, ein JMenu verhalten sich wie ein JButton zu machen, aber ich habe einige Probleme mit und hoffentlich jemand hier kann helfen!

Ich habe eine menuListener zum JMenu Artikel mit diesem hinzugefügt, aber ich kann das Popup-Menü erhalten / konzentrieren zu lassen, damit ich richtig die JMenu klicken Male wiederholt diese Funktion auszulösen, und ich hatte gehofft, jemand könnte mir sagen, was ich ‚tue falsch. Danke.

public void menuSelected(MenuEvent e)
        {
            ... // do stuff here code
            JMenu source = (JMenu)e.getSource();
            source.setSelected(false);
            source.setPopupMenuVisible(false);

        }
War es hilfreich?

Lösung

Nicht ganz sicher, was Sie fragen ...

Aber JMenuBar erbt von Container - wenn Sie lieber ein JButton, um es als ein JMenu hinzufügen würde, können Sie einfach anrufen -

JMenuBar menuBar = ....
JButton myButton = ....
menuBar.add(myButton);

Andere Tipps

In diesem Codebeispiel läuft in Eclipse, erneut besorgt darüber, wie Sie es verwenden?

public class MyMenuFrame extends JFrame {


    public MyMenuFrame() throws HeadlessException {
        super("My Frame");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400, 300);
        Container pane = this.getContentPane();
        pane.setLayout(new BorderLayout());
        pane.add(new JLabel("Hi there"), BorderLayout.PAGE_START);
        this.setVisible(true);
        JMenuBar menubar = new JMenuBar();
        JMenu menu = new JMenu("File");

        menu.addMenuListener(new MenuListener() {

            @Override
            public void menuSelected(MenuEvent e) {
                System.out.println("a");

            }

            @Override
            public void menuDeselected(MenuEvent e) {
                System.out.println("a");

            }

            @Override
            public void menuCanceled(MenuEvent e) {
                System.out.println("a");

            }
        });
        menubar.add(menu);
        this.setJMenuBar(menubar );
    }

    public static void main(String[] args) {
        new MyMenuFrame();
    }
}

Ich weiß, das ist ein alter Thread, aber ich glaube, ich könnte eine Lösung. Ich stolperte accross dieses Problem in einem meiner apps, und eine Abhilfe gefunden. Versuchen Sie, eine JMenuItem anstelle eines JMenu verwenden. Es wird die gleiche L & F als JMenu haben, wenn Sie es zu einem JMenuBar befestigen. Das einzige, was Sie tun müssen, ist die Größe der neuen „Taste“, wie Ihr Layout Manager einstellen (auch wenn Sie nicht ein gesetzt haben), diese Komponente auf der Grundlage seine eigenen Regeln der Größe werden:

http://www.javaworld.com /javaworld/jw-09-2000/jw-0922-javatraps.html

Die Art und Weise, es zu tun ist unter diesem Link zu finden (wenn Sie sich unwohl Klick auf den Link fühlen, Google nach „setsize funktioniert nicht“ - es wird die in den Top-Ten-Ergebnisse sein). Wenn Sie die Größe nicht richtig eingestellt haben, wird Ihre neue „Taste“ wird der verbleibende Speicherplatz Ihres JMenuBar füllen.

versuchen, diesen Code ein:

menuItem.setMinimumSize(someMenu.getSize());
menuItem.setPreferredSize(someMenu.getSize());
menuItem.setMaximumSize(someMenu.getSize());
menuItem.setActionCommand("ActionText");

setActionCommand () -Methode wird ein Aktionsbefehlssatz, so dass, wenn Sie Ihre neue „Button“ klicken wird dies der Aktionsbefehl durch die Aktion Ereignisargument ausgeführt Methode, um die Aktion übergeben, so dass Sie leicht erkennen können:

public void actionPerformed(ActionEvent e) {
    System.out.println(e.getActionCommand());
}

Hope, das hilft!

Es ist sehr schwierig zu bestimmen, was Sie versuchen, hier zu tun. Aber ich glaube nicht, dass Sie richtig JMenu verwenden.

Ein JMenu ist das Objekt, das ein Menü darstellt. Es ist getrennt von der Menüleiste (JMenuBar) und aus dem Menüpunkt (JMenuItem). Ein JMenuBar enthält in der Regel mehrere JMenus (Datei, Bearbeiten, usw.), die mehrere JMenuItems wiederum enthalten (Neu, Öffnen, Schließen). Die JMenuItems sind, was geklickt und „wirkt wie ein Knopf“ im Menü.

Um einen Menüpunkt wie eine Schaltfläche zu handeln zu bekommen, einfach fügen Sie es in das Menü. Zum Beispiel:

JMenu fileMenu = new JMenu("File");
JMenuItem newChoice = new JMenuItem("New");
newChoice.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        newHasBeenSelected();
    }
});
fileMenu.add(newChoice);

Wenn Sie versuchen, ein Pop-up-Menü zu erstellen, müssen Sie JPopupMenu statt JMenu verwenden, und Sie brauchen kein JMenuBar. Hier sind die Java-Tutorials auf Menüs: http: // java. sun.com/docs/books/tutorial/uiswing/components/menu.html

Und hier sind die Java-Dokumentation für JMenuBar , JMenu , JPopupMenu und JMenuItem .

Wenn Sie Ihre Frage bearbeiten und geben eine detailliertere Erklärung dessen, was Sie tun, ich könnte in der Lage sein, mehr spezifische Hilfe zu geben.

Ok ich beschlossen, das ist ein bisschen mehr zu untersuchen und die folgenden sind die reslut und erscheinen wie ein JButton zu handeln, sondern erscheint wie ein JMenu auf einem JMenuBar. Code unten. (Anmerkung Hinzufügen nur ein Action zu einem JMenu funktionierte nicht richtig, die der Grund für die Mouselistener ist. Sie einen Action nur zum menubutton hinzufügen wie eine normale Taste und solange Sie menuitems zum menubutton hinzufügen dont (was technisch konnte man) es wird als JMenu auf dem JMenuBar erscheinen, aber wie eine Schaltfläche verhält.

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.lang.reflect.Method;
import java.util.EventListener;   
import javax.swing.ImageIcon;
import javax.swing.JMenu;

public class MenuButton extends JMenu {

private boolean startedIn = false;
private ActionListener action;

public MenuButton(String title) {
    super(title);
    removeListeners(this);
    this.addMouseListener(new MenuButtonListener());

}

public MenuButton(ImageIcon icon) {
    super();
    removeListeners(this);
    this.addMouseListener(new MenuButtonListener());
    this.setIcon(icon);
}

public void addActionListener(ActionListener a) {
    action = a;
}
    //we need to remove all the listeners already associated with a JMenu. If we do
//not do this, then it will not behave as expected because some mouseclicks are eaten 
//by these listeners. There is no easy way to do that, the following method is a 
//workaroundprovided in the java bug database. 
static private void removeListeners(Component comp) {
    Method[] methods = comp.getClass().getMethods();
    for (int i = 0; i < methods.length; i++) {
        Method method = methods[i];
        String name = method.getName();
        if (name.startsWith("remove") && name.endsWith("Listener")) {

            Class[] params = method.getParameterTypes();
            if (params.length == 1) {
                EventListener[] listeners = null;
                try {
                    listeners = comp.getListeners(params[0]);
                } catch (Exception e) {
                    // It is possible that someone could create a listener
                    // that doesn't extend from EventListener. If so, ignore
                    // it
                    System.out.println("Listener " + params[0]
                            + " does not extend EventListener");
                    continue;
                }
                for (int j = 0; j < listeners.length; j++) {
                    try {
                        method.invoke(comp, new Object[] { listeners[j] });
                        // System.out.println("removed Listener " + name +
                        // " for comp " + comp + "\n");
                    } catch (Exception e) {
                        System.out
                                .println("Cannot invoke removeListener method "
                                        + e);
                        // Continue on. The reason for removing all
                        // listeners is to
                        // make sure that we don't have a listener holding
                        // on to something
                        // which will keep it from being garbage collected.
                        // We want to
                        // continue freeing listeners to make sure we can
                        // free as much
                        // memory has possible
                    }
                }
            } else {
                // The only Listener method that I know of that has more
                // than
                // one argument is removePropertyChangeListener. If it is
                // something other than that, flag it and move on.
                if (!name.equals("removePropertyChangeListener"))
                    System.out.println("    Wrong number of Args " + name);
            }
        }
    }
}

public class MenuButtonListener extends MouseAdapter {

    boolean within = false;
    boolean pressed = false;


    public void mousePressed(MouseEvent e) {
        MenuButton.this.setSelected(true);
        pressed = true;
        //System.out.println("pressed");
    }

    public void mouseReleased(MouseEvent e) {
        //System.out.println("released");
        MenuButton.this.setSelected(false);
        if (action != null && within && pressed) {
            action.actionPerformed(new ActionEvent(this,
                    ActionEvent.ACTION_PERFORMED, null));
            MenuButton.this.setSelected(false);
        }
        pressed = false;
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        within = true;
    }

    @Override
    public void mouseExited(MouseEvent e) {
        within = false;
    }
}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top