2010-05-22 10 views

Odpowiedz

5

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

} 
+0

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

+0

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

+0

@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

1

mógłbyś mi powiedzieć jak mój wniosek może zażądać do de-focus sam?

Można spróbować:

frame.toBack(); 

Jeśli to nie zadziała, to możesz ikonifikacja swoje zastosowanie w tym przypadku nacisk powinien przejść do poprzedniej aplikacji.

+0

Dla porównania oba działają zgodnie z oczekiwaniami na Mac OS X. – trashgod

0

Język programowania Java jest niezależny od platformy. Zamiast czytać dokumentację referencyjną firmy Apple, powinieneś używać oficjalnej wersji Java API Reference Documentation. Znajdziesz tam dokumentację dla JFrame, WindowListener i WindowAdapter. Możesz zarejestrować WindowListener na JFrame, używając funkcji addWindowListener. Program nasłuchujący okna może być używany do przechwytywania i obsługi różnych zdarzeń związanych z oknem, w tym aktywacji/dezaktywacji (które okno jest na górze) lub uzyskanego fokusa/utraconego fokusa (w którym oknie będą odbierane zdarzenia klawiatury). Jeśli dostarczasz własny WindowListener i nie chcesz implementować każdej funkcji, WindowAdapter jest przydatny do tego celu, ponieważ implementuje WindowListener, ale zapewnia puste definicje dla każdej funkcji. Jeśli chodzi o rozogniskowanie (w tym sensie, że masz na myśli), toBack może być użyte do tego, podczas gdy toFront robi odwrotnie.

Edytuj
Większość tych informacji została już podana w poprzednich postach; jednak dodałem to, aby podkreślić:

  • Java jest językiem niezależnym od platformy.
  • Java jest produktem Sun Microsystems (obecnie Oracle).
  • Stosowanie oficjalnego numeru Java API Reference Documentation firmy Sun ma więcej sensu niż poleganie na dokumentacji referencyjnej dostarczonej przez firmę Apple, ponieważ wszystko, co zawiera oficjalna dokumentacja interfejsu API, będzie działać na wszystkich platformach; mając na uwadze, że wszystko, co wynika z dokumentacji referencyjnej Apple, może bardzo dobrze pasować do implementacji Apple.
  • Dokumentacja referencyjna dla JFrame z oficjalnej, autorytatywnej dokumentacji referencyjnej zawiera wszystkie informacje niezbędne do udzielenia odpowiedzi na pytanie (stąd kolejny powód do zapoznania się z oficjalną dokumentacją interfejsu API, zamiast polegać na dokumentacji firmy Apple).
+0

-1, zasugerowano WindowListener 6 godzin wcześniej. Funkcja toBack() została zasugerowana 5 godzin wcześniej. Nie widzę powodu, aby powtarzać sugestie. – camickr

+0

Ponadto, 'ApplicationListener' ma na celu uzupełnienie, a nie zastąpienie podstawowego interfejsu użytkownika. Zobacz 'README.txt' dla przykładu' OSXAdapter' cytowanego w mojej odpowiedzi. – trashgod

+0

@camickr, chciałem podkreślić wykorzystanie oficjalnej dokumentacji referencyjnej (zobacz moją edycję). Ponadto inni nie potrafią wskazać, że "koncentracja" w terminologii Java oznacza nacisk na klawiaturę (nie to okno jest na wierzchu), co również daje moja odpowiedź. –

Powiązane problemy