To, o co pytałem pierwotnie, nie jednoznacznie określiło moje pytanie/problem, więc wyjaśnię to lepiej. Mam JButton
, który ustawia JDialog
na widoczny. JDialog ma numer WindowListener
, który ustawia go na NIEWIDOCZNY w zdarzeniu windowDeactivated()
, które jest wyzwalane za każdym razem, gdy użytkownik kliknie poza oknem dialogowym. Przycisk ActionListener
sprawdza, czy okno dialogowe jest widoczne, ukrywa je, jeśli jest prawdziwe, pokazuje je, jeśli są fałszywe.Utwórz okno właściwości kontroli, przycisk sterowany jako JDialog
windowDeactivated()
zawsze wyzwala kliknięcie przycisku, o ile użytkownik kliknie poza oknem dialogowym. Problem polegający na tym, że użytkownik kliknie przycisk, aby zamknąć okno dialogowe. Okno zostanie zamknięte przez WindowListener
, a następnie ActionListener
próbuje je wyświetlić.
Jeśli windowDeactivated()
nie ma wartości , to okno dialogowe jest nadal otwarte, ale znajduje się za oknem nadrzędnym. Pytam, jak uzyskać dostęp do lokalizacji kliknięcia wewnątrz windowDeactivated()
. Jeśli wiem, że użytkownik kliknął przycisk, a windowDeactivated() może pominąć ukrywanie okna dialogowego, tak że przycisk ActionListener
zobaczy, że jest nadal widoczny i ukrywa go.
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); } }
Nie jestem pewien, jakie jest pytanie. Wygląda na to, że go rozgryzłeś. Wygląda to dobrze. (Na pierwszy rzut oka) – jjnguy
To, co mam powyżej, zrobi wszystko, co chcę, z wyjątkiem kliknięcia poza oknem dialogowym. Kliknięcie na zewnątrz zamyka okno dialogowe, co jest w porządku, ale kiedy kliknę przycisk, aby otworzyć okno dialogowe, nie otwiera się za pierwszym razem.Z tego co rozumiem, WindowListener wyzwala przed ActionListener i nawet jeśli okno dialogowe NIE jest faktycznie widoczne po wywołaniu ActionListener, wywołanie .isVisible() zwraca wartość true. Tak więc przycisk będzie .setVisible (false), mimo że nie jest widoczny. – Brian
Brian, możesz użyć 'WindowAdapter' zamiast detektora okien. Następnie wystarczy wdrożyć odpowiednie metody. – jjnguy