Zeigt/versteckt ein JPopupMenu von einem JButton; FocusListener funktioniert nicht?

Brauchte ich einen JButton mit einer angebrachten dropdown-Menü "Stil". Also nahm ich ein JPopupMenu und befestigt Sie an den JButton im Wege und Sie können im code sehen Sie unten. Was er tun muss, ist dieses:

  • zeigen Sie das popup beim anklicken
  • es verstecken, wenn er gedrückt wird ein zweites mal
  • verstecken, wenn ein Element ausgewählt ist, in dem popup -
  • ausblenden, wenn der Benutzer klickt irgendwo sonst auf dem Bildschirm

Diese 4 Dinge funktionieren, aber da der boolean-flag, das ich verwende, wenn der Benutzer klickt irgendwo anders oder wählt ein Objekt aus, muss ich zweimal klicken Sie auf den button, bevor es wieder auftaucht. Deshalb habe ich versucht, um einen FocusListener (das ist absolut nicht mehr reagiert), um das zu beheben, und setzen Sie das flag false in diesen Fällen.

EDIT: Letzter Versuch eine Antwort zu posten...

Hier sind die Zuhörer: (Es ist in einer Klasse JButton erweitern, so dass der zweite Hörer ist auf den JButton.)

//Show popup on left click.
menu.addFocusListener(new FocusListener() {
 @Override
 public void focusLost(FocusEvent e) {
  System.out.println("LOST FOCUS");
  isShowingPopup = false;
 }

 @Override
 public void focusGained(FocusEvent e) {
  System.out.println("GAINED FOCUS");
 }
});

addActionListener(new ActionListener() {
 @Override
 public void actionPerformed(ActionEvent e) {
  System.out.println("isShowingPopup: " + isShowingPopup);
  if (isShowingPopup) {
   isShowingPopup = false;
  } else {
   Component c = (Component) e.getSource();
   menu.show(c, -1, c.getHeight());
   isShowingPopup = true;
  }
 }
});

Ich ve wurde kämpfen mit diesem für viel zu lange jetzt. Wenn jemand kann mir eine Ahnung, was falsch mit diesem, wäre es toll!

Dank!

Code:

public class Button extends JButton {

    //Icon.
    private static final ImageIcon ARROW_SOUTH = new ImageIcon("ArrowSouth.png");

    //Unit popup menu.
    private final JPopupMenu menu;

    //Is the popup showing or not?
    private boolean isShowingPopup = false;

    public Button(int height) {
        super(ARROW_SOUTH);
        menu = new JPopupMenu(); //menu is populated somewhere else

        //FocusListener on the JPopupMenu
        menu.addFocusListener(new FocusListener() {
            @Override
            public void focusLost(FocusEvent e) {
                System.out.println("LOST FOCUS");
                isShowingPopup = false;
            }

            @Override
            public void focusGained(FocusEvent e) {
                System.out.println("GAINED FOCUS");
            }
        });

        //ComponentListener on the JPopupMenu
        menu.addComponentListener(new ComponentListener() {
            @Override
            public void componentShown(ComponentEvent e) {
                System.out.println("SHOWN");
            }

            @Override
            public void componentResized(ComponentEvent e) {
                System.out.println("RESIZED");
            }

            @Override
            public void componentMoved(ComponentEvent e) {
                System.out.println("MOVED");
            }

            @Override
            public void componentHidden(ComponentEvent e) {
                System.out.println("HIDDEN");
            }
        });

        //ActionListener on the JButton
        addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("isShowingPopup: " + isShowingPopup);
                if (isShowingPopup) {
                    menu.requestFocus();
                    isShowingPopup = false;
                } else {
                    Component c = (Component) e.getSource();
                    menu.show(c, -1, c.getHeight());
                    isShowingPopup = true;
                }
            }
        });

        //Skip when navigating with TAB.
        setFocusable(true); //Was false first and should be false in the end.

        menu.setFocusable(true);
    }

}
  • Also, das Hauptproblem, das ich habe, ist, dass focusGained() und focuslost wurde (), nie ausgelöst, auch wenn ich halten Sie auf das popup erscheinen und verschwinden.
InformationsquelleAutor Joanis | 2010-03-11
Schreibe einen Kommentar