Implementacje windowActivated()
i windowDeactivated()
w WindowListener
lub WindowAdapter
powie Ci, kiedy okno jest aktywowane lub dezaktywowane. Nie potrzebujesz do tego ApplicationListener
.
Dodatek: Chociaż nie jest to wymagane w tym przypadku, przezroczyste wdrożenie dodatkowej funkcjonalności określonej w ApplicationListener
można znaleźć w tym example.
Dodatek: Zobacz także How to Write Window Listeners.
Dodatek: Myślę, że rozumiem, co masz na myśli. W przykładzie OSXAdapter
, który używa -Dapple.laf.useScreenMenuBar=true
, menu znikają, gdy ostatnie okno (domyślnie HIDE_ON_CLOSE
) zostaje zamknięte. Jest mniej niż optymalna, ale menu pozostaną w menu aplikacji; wybierając albo przywraca menu ekranu. Inną możliwością jest modyfikacja menu dokowania w 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);
}
}
Problem polega na tym, że ukryłem okno używając 'frame.setVisible (false)', które ukrywa okno, ale nie działa tak jak opcja "ukryj" komputera Mac. Ukrywa ramkę, jednak aplikacja zachowuje ostrość. Użycie 'frame.toBack()' również nie działa; aplikacja zachowała ostrość, tylko okno zostało przesunięte do tyłu. Na komputerze Mac, po ukryciu aplikacji, aplikacja ukrywa wszystkie swoje okna i rozmazuje je, a następnie odkrywa je wszystkie po nadaniu ostrości aplikacji. Jednak w przypadku 'frame.setVisible()', nawet po rozogniskowaniu aplikacji i przywróceniu jej ostrości, nie pojawia się ponownie. –
(Ciąg dalszy) Są to zupełnie inne metody, 'setVisible()' i funkcja ukrywania Maca. Problem polega na tym, że już korzystam z WindowListener, ale okno nie pojawia się ponownie, gdy ustawiam fokus, więc to nie działa. Widzisz moje wielkie problemy, tutaj? Próbowałem ich. Czy masz jakieś inne sugestie? Wiem, że prawdopodobnie nie masz doświadczenia z komputerami Mac, ale byłeś bardzo pomocny w przeszłości. –
@Stuart: 'toBack()' nie daje obietnic dotyczących ostrości. AFAIK, przełączanie aplikacji jest zadaniem użytkownika. Powyższy przykład pokazuje zdarzenia "okna" dla dwóch okien, ale możesz także zapoznać się z samouczkiem. – trashgod