implementaciones de windowActivated()
y windowDeactivated()
en WindowListener
o WindowAdapter
le dirá cuando una ventana se activa o desactiva. No necesita ApplicationListener
para eso.
Addendum: Aunque no es necesario en este caso, se puede encontrar una implementación transparente de la funcionalidad adicional especificada en ApplicationListener
en este example.
Adición: Vea también How to Write Window Listeners.
Adición: Creo que veo lo que quieres decir. En el ejemplo OSXAdapter
, que usa -Dapple.laf.useScreenMenuBar=true
, los menús desaparecen cuando se cierra la última ventana (HIDE_ON_CLOSE
por defecto). No es óptimo, pero los menús About…
y Preferences
permanecen en el menú de la aplicación; elegir cualquiera restaura el menú de la pantalla. Otra posibilidad es modificar el menú de base en com.apple.eawt.Application
.
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.awt.event.WindowListener;
import java.awt.event.WindowStateListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class WindowTest extends JFrame implements ActionListener,
WindowListener, WindowFocusListener, WindowStateListener {
public static final void main(String args[]) throws Exception {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new WindowTest("One");
new WindowTest("Two");
}
});
}
public WindowTest(String name) {
super(name);
this.setName(name);
this.setLayout(new GridLayout(0, 1));
createButton("Back");
createButton("Front");
createButton("Hide");
this.addWindowListener(this);
this.addWindowFocusListener(this);
this.addWindowStateListener(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.pack();
this.setVisible(true);
}
private void createButton(String name) {
JButton b = new JButton(name);
this.add(b);
b.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
String s = e.getActionCommand();
if ("Back".equals(s)) {
this.toBack();
} else if ("Front".equals(s)) {
this.toFront();
} else {
this.setExtendedState(JFrame.ICONIFIED);
}
}
@Override
public void windowOpened(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowClosing(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowClosed(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowIconified(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowDeiconified(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowActivated(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowDeactivated(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowGainedFocus(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowLostFocus(WindowEvent e) {
System.out.println(e);
}
@Override
public void windowStateChanged(WindowEvent e) {
System.out.println(e);
}
}
El problema es que oculté mi ventana usando 'frame.setVisible (false)', que oculta la ventana, pero no funciona como la opción 'ocultar' de una Mac. Oculta el marco, sin embargo, la aplicación conserva el foco. El uso de 'frame.toBack()' tampoco funcionó; la aplicación retuvo el foco, solo la ventana se movió hacia atrás. En un Mac, cuando oculta una aplicación, la aplicación oculta todas sus ventanas y desenfoques, y las muestra todas cuando le da enfoque a la aplicación. Sin embargo, con 'frame.setVisible()', incluso cuando desenfocas la aplicación y le devuelves el foco, no vuelve a aparecer. –
(Continuación) Son métodos completamente diferentes, 'setVisible()' y una función de ocultación de Mac. El problema es que ya uso WindowListener, pero la ventana no reaparece cuando le doy el foco, por lo que no funciona. ¿Ves mis grandes problemas aquí? He intentado esto. ¿Tiene alguna otra sugerencia? Sé que probablemente no tienes experiencia con Mac, pero has sido muy útil en el pasado. –
@Stuart: 'toBack()' no hace promesas sobre el enfoque. AFAIK, el cambio de aplicaciones es competencia del usuario. El ejemplo anterior muestra eventos de 'Ventana' para dos ventanas, pero también puede explorar el tutorial. – trashgod