Lo que pregunté originalmente no indicaba claramente mi pregunta/problema, así que lo explicaré mejor. Tengo un JButton
que establece un JDialog
en visible. El JDialog tiene un WindowListener
que lo configura como NO visible en el evento windowDeactivated()
, que se activa cada vez que el usuario hace clic fuera del cuadro de diálogo. El botón ActionListener
comprueba si el diálogo es visible, lo oculta si es verdadero, lo muestra si es falso.Crear una ventana de propiedades de inspección, botón accionado como un JDialog
windowDeactivated()
siempre se activará si se hace clic en el botón o no, siempre que el usuario haga clic fuera del cuadro de diálogo. El problema que tengo es cuando el usuario hace clic en el botón para cerrar el diálogo. El cuadro de diálogo se cierra con el WindowListener
y luego el ActionListener
intenta mostrarlo.
Si windowDeactivated()
no es setVisible(false)
, el cuadro de diálogo sigue abierto, pero detrás de la ventana principal. Lo que estoy pidiendo es cómo obtener acceso a la ubicación del clic dentro de windowDeactivated()
. Si sé que el usuario hizo clic en el botón y windowDeactivated() puede omitir el ocultamiento del cuadro de diálogo, de modo que el botón ActionListener
verá que todavía está visible y lo ocultará.
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); } }
No estoy seguro de cuál es la pregunta. Parece que parece que lo has descubierto. Eso se ve bien (A primera vista) – jjnguy
Lo que he mencionado arriba hará todo lo que yo desee, excepto cuando haga clic fuera del diálogo. Al hacer clic afuera se cierra el diálogo, lo cual está bien, pero cuando hago clic en el botón para abrir el cuadro de diálogo, no se abre la primera vez.Por lo que entiendo, el WindowListener se dispara antes que el ActionListener y aunque el diálogo NO es realmente visible cuando el ActionListener se activa, la llamada .isVisible() devuelve un verdadero. Por lo tanto, el botón mostrará .setVisible (false) aunque no esté visible. – Brian
Brian, puede usar un 'WindowAdapter' en lugar de un oyente de ventana. Entonces solo tienes que implementar los métodos que quieras. – jjnguy