Quello che ho chiesto in origine non indicava chiaramente la mia domanda/problema, quindi lo spiegherò meglio. Ho un JButton
che imposta un JDialog
visibile. JDialog ha un WindowListener
che lo imposta su NON visibile sull'evento windowDeactivated()
, che viene attivato ogni volta che l'utente fa clic all'esterno della finestra di dialogo. Il pulsante ActionListener
controlla se la finestra di dialogo è Visibile, lo nasconde se è vero, lo mostra se è falso.Creare una finestra delle proprietà di controllo, pulsante come JDialog
windowDeactivated()
attiverà sempre se si fa clic sul pulsante o meno, a condizione che l'utente faccia clic fuori dalla finestra di dialogo. Il problema che sto avendo è quando l'utente fa clic sul pulsante per chiudere la finestra di dialogo. La finestra di dialogo viene chiusa dal WindowListener
e quindi lo ActionListener
tenta di visualizzarlo.
Se windowDeactivated()
non è setVisible(false)
, la finestra di dialogo è ancora aperta, ma dietro la finestra padre. Quello che sto chiedendo è come ottenere l'accesso alla posizione del clic all'interno di windowDeactivated()
. Se so che l'utente ha fatto clic sul pulsante e windowDeactivated() può ignorare la finestra di dialogo, in modo che il pulsante ActionListener
vedrà che è ancora visibile e lo nasconde.
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); } }
Non so quale sia la domanda. Sembra che tu l'abbia capito. Sembra giusto (A prima vista) – jjnguy
Quello che ho sopra farà tutto ciò che volevo, tranne quando clicco fuori dalla finestra di dialogo. Fare clic all'esterno chiude la finestra di dialogo, che va bene, ma quando faccio clic sul pulsante per aprire la finestra di dialogo, non si apre la prima volta.Da quanto ho capito, il WindowListener si innesca prima di ActionListener e anche se la finestra di dialogo NON è effettivamente visibile quando si attiva il trigger ActionListener, la chiamata .isVisible() restituisce un valore vero. Quindi, il pulsante sarà .setVisible (false) anche se non è visibile. – Brian
Brian, puoi usare un 'WindowAdapter' invece di un listener di finestre. Quindi devi solo implementare i metodi che desideri. – jjnguy