2010-05-22 12 views

Respuesta

5

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); 
    } 

} 
+0

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. –

+0

(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. –

+0

@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

1

podría decirme cómo mi solicitud puede solicitar a de-foco en sí?

Usted puede tratar de:

frame.toBack(); 

Si eso no funciona, entonces puede iconificar su aplicación, en cuyo caso el enfoque debe ir a la aplicación anterior.

frame.setExtendedState(...); 
+0

Como referencia, ambos funcionan como se esperaba en Mac OS X. – trashgod

0

El lenguaje de programación Java es independiente de la plataforma. En lugar de leer la documentación de referencia de Apple, debe usar el Java API Reference Documentation oficial. Allí encontrará documentación para JFrame, WindowListener y WindowAdapter. Puede registrar un WindowListener en un JFrame, utilizando la función addWindowListener. El oyente de ventana se puede usar para interceptar y manejar una variedad de eventos relacionados con la ventana, incluidos activado/desactivado (qué ventana está en la parte superior) o foco ganado/foco perdido (qué ventana recibirá los eventos del teclado). Si está suministrando su propio WindowListener y no desea implementar cada función, WindowAdapter es útil para ese fin, ya que implementa WindowListener pero proporciona definiciones vacías para cada función. En cuanto al desenfoque (en el sentido en que te refieres), toBack se puede usar para eso, mientras que toFront hace lo contrario.

Editar
La mayor parte de esta información ya fue dada en mensajes anteriores; sin embargo, agregué esto para enfatizar:

  • Java es un lenguaje independiente de la plataforma.
  • Java es un producto de Sun Microsystems (ahora Oracle).
  • Por lo tanto, utilizar el Java API Reference Documentation oficial de Sun tiene más sentido que confiar en cualquier documentación de referencia proporcionada por Apple, porque cualquier elemento incluido en la documentación de referencia API oficial funcionará en todas las plataformas; mientras que cualquier cosa de la documentación de referencia de Apple puede ser específica para la implementación de Apple.
  • La documentación de referencia para JFrame de la documentación de referencia oficial autorizada proporciona toda la información necesaria para responder la pregunta (de ahí otro motivo más para consultar la documentación de referencia API oficial, en lugar de confiar en la documentación de Apple).
+0

-1, WindowListener se sugirió 6 horas antes. toBack() fue sugerido 5 horas antes. No veo ninguna razón para repetir las sugerencias. – camickr

+0

Además, 'ApplicationListener' está destinado a complementar, en lugar de suplantar, la interfaz de usuario central. Ver 'README.txt' para el ejemplo' OSXAdapter' citado en mi respuesta. – trashgod

+0

@camickr, quería enfatizar el uso de la documentación de referencia oficial (ver mi edición). Además, los otros no indican que el "enfoque" en la terminología de Java implica el enfoque del teclado (no la ventana que está en la parte superior), que también da mi respuesta. –

Cuestiones relacionadas