Was ich ursprünglich fragte nicht eindeutig meine Frage/Problem, so werde ich es besser erklären. Ich habe eine JButton
, die eine JDialog
sichtbar macht. Der JDialog verfügt über eine WindowListener
, die es auf dem windowDeactivated()
-Ereignis, das immer dann ausgelöst wird, wenn der Benutzer außerhalb des Dialogfelds klickt, auf NO sichtbar. Die Schaltfläche ActionListener
prüft, ob der Dialog sichtbar ist, blendet ihn aus, wenn er wahr ist, zeigt ihn an, wenn er falsch ist.Erstellen Sie ein inspizierende Eigenschaften Fenster, Button als JDialog
windowDeactivated()
wird immer ausgelöst, wenn Sie auf die Schaltfläche klicken oder nicht, solange der Benutzer außerhalb des Dialogfelds klickt. Das Problem, das ich habe, ist, wenn der Benutzer auf die Schaltfläche klickt, um den Dialog zu schließen. Der Dialog wird durch die WindowListener
geschlossen und dann versucht die ActionListener
, es anzuzeigen.
Wenn windowDeactivated()
nicht setVisible(false)
ist, dann ist das Dialogfeld noch geöffnet, aber hinter dem übergeordneten Fenster. Was ich verlange, ist, wie man auf den Ort des Klicks innerhalb windowDeactivated()
zugreifen kann. Wenn ich weiß, dass der Benutzer auf die Schaltfläche geklickt hat und windowDeactivated() kann das Ausblenden des Dialogfelds überspringen, so dass die Schaltfläche ActionListener
wird sehen, dass es immer noch sichtbar ist und es ausblenden.
public PropertiesButton extends JButton { private JDialog theWindow; public PropertiesButton() { theWindow = new JDialog(); theWindow.setUndecorated(true); theWindow.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); theWindow.add(new JMenuCheckBoxItem("Something")); theWindow.addWindowListener(new WindowListener() { // just an example, need to implement other methods public void windowDeactivated(WindowEvent e) { theWindow.setVisible(false); } }); this.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (theWindow.isVisible()) { theWindow.setVisible(false); } else { JButton btn = (JButton)e.getSource(); theWindow.setLocation(btn.getLocationOnScreen.x,btn.getLocationOnScreen.x-50); theWindow.setVisible(true); } } }); theWindow.setVisible(false); } }
Nicht sicher, was die Frage ist. Es sieht so aus, als hättest du es herausgefunden. Das sieht gut aus. (Auf den ersten Blick) – jjnguy
Was ich oben habe, wird alles tun, was ich wollte, außer wenn das Klicken außerhalb des Dialogs. Ein Klick nach außen schließt den Dialog, was gut ist, aber wenn ich auf die Schaltfläche klicke, öffnet sich der Dialog nicht beim ersten Mal.Von dem, was ich verstehe, wird der WindowListener vor dem ActionListener ausgelöst und obwohl der Dialog NICHT wirklich sichtbar ist, wenn der ActionListener auslöst, gibt der .isVisible() - Aufruf ein true zurück. Also wird die Schaltfläche .setVisible (false), obwohl es nicht sichtbar ist. – Brian
Brian, Sie können einen 'WindowAdapter' anstelle eines Fenster-Listeners verwenden. Dann müssen Sie nur die gewünschten Methoden implementieren. – jjnguy