Herausfinden, ob meine Anwendung gerade aktiv ist

Hallo Leute

Ich habe folgendes Problem: Ich habe eine GUI-Anwendung, die hauptsächlich aus fremdprogrammierten Klassen und teilweise aus eigenentwickelten Klassen besteht. Innerhalb dieser Anwendung läuft ein Hintergrundthread, der auf bestimmte Events reagiert und den Benutzer darüber informieren soll (es ist eine Art eMail-Client, ein Event ist z.b. das Ankommen einer neuen Nachricht).

Das Problem dabei: wenn der Benutzer gerade in der Anwendung arbeitet, soll lediglich ein Klang abgespielt werden, ist die Anwendung im Hintergrund soll eine Messagebox gebracht werden. „Hintergrund“ bedeutet dabei, dass der Benutzer gerade mit keiner der Fenster der Anwendung arbeitet. Also nicht nur minimierte Fenster sondern auch Fenster, die von einer anderen Anwendung überlagert sind.

Meine erste Idee war es, zu Prüfen, wer gerade den Focus hat, darüber herauszufinden, zu welchem Fenster das Control gehört und dann das Fenster zu fragen, ob es im Vordergrund ist. Habe allerdings keine praktikable Methode dafür gefunden.

Wäre die Anwendung komplett selbsterstellt, könnte man ja leicht den Code anpassen, um an diese Info zu kommen. Auf den meisten Teil der Anwendung habe ich aber keinen Zugriff, muss also mit Standardmitteln auskommen.

Hat hier jemand eine Lösung für das Problem?

Ach ja, die Randbedingungen:
das Programm läuft auf einem Windows-PC (WinXP), es wird die Sun Java VM 1.4.2_03 verwendet. Ein Upgrade auf eine neuere VM ist derzeit aus systemtechnischen Gründen nicht möglich (schwer zu erklären also bitte nicht fragen). Die Anwendung arbeitet mit normalen Swing-Klassen. Das ganze ist eine stand-alone Anwendung, kein Applet.

lg
Erwin

Hi,
also es gibt die Funktion:
this.hasFocus()
für ein JFrame, ich weiß jetzt nicht ob du JFrame nutzt, wenn ja gibt diese Funktion ein Bool-Wert zurück, und damit solltest du arbeiten können.

MFG
Marc Kohlbau

Hallo Erwin.

wenn der Benutzer gerade in der Anwendung
arbeitet, soll lediglich ein Klang abgespielt werden, ist die
Anwendung im Hintergrund soll eine Messagebox gebracht werden.

Auf den meisten Teil der Anwendung habe ich aber keinen Zugriff, muss
also mit Standardmitteln auskommen.

Wenn Du auf das Hauptfenster der Anwendung per Java zugreifen kannst,
brauchst Du lediglich dem Fenster einen FocusListener hinzufügen, siehe http://java.sun.com/docs/books/tutorial/uiswing/even….

Code-Beispiel:

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

/\*\*
 \* JFrame, der auf Fokusereignisse reagiert.
 \*/
public class FocusTest extends JFrame {
 private static final long serialVersionUID = 235703577137480777L;
 protected String \_sFensterName = "?";

 /\*\*
 \* Erstellt ein neues Fenster mit eingebautem Fokuslauscher.
 \* 
 \* @param sFensterName String mit Name des Fensters
 \*/
 public FocusTest(String sFensterName) {
 \_sFensterName = sFensterName;
 this.addFocusListener(new FocusListener() {
 public void focusGained(FocusEvent e) {
 System.out.println(\_sFensterName + " im Vordergrund: Beep!");
 Toolkit.getDefaultToolkit().beep();
 }

 public void focusLost(FocusEvent e) {
 System.out.println(\_sFensterName + " im Hintergrund: Zeige Popup!");
 }
 });
 this.setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE);
 this.getContentPane().add(new JLabel("Fenster " + \_sFensterName));
 }

 /\*\*
 \* Test- und Demonstrationscode.
 \* 
 \* @param args
 \*/
 public static void main(String[] args) {
 JFrame frame1 = new FocusTest("Fenster1");
 frame1.setSize(new Dimension(400,300));
 frame1.setVisible(true);
 }
}

Gruß,
-Andreas.

Präzisierung
hallo leute

nachdem die ersten beiden Postings etwas in die falsche Richtung gehen hier noch eine Präzisierung:

die Anwendung hat ein Fenster, das ständig offen ist sowie mehrere Bearbeitungsfenster für Nachrichten (also je nach offenen Nachrichten null bis viele). Alle diese Bearbeitungsfenster sind selbst JFrames sind und dazu noch unabhängig vom Hauptfenster. Natürlich kann ich mit einem Focuslistener mit auf das Hauptfenster setzen, nur hilft mir das nicht viel, da der Benutzer noch mehrere Subfenster offen haben kann. Der Hintergrundthread muss aber wissen, ob irgendein Fenster den Focus hat. Allerdings bekommt der Hintergrundthread nicht mit, was der Benutzer so öffnet.

Sprich: mein Thread hat keine Ahnung, welche Fenster alle gerade offen sind, sollte aber wissen, ob IRGENDEINES dieser Fenster gerade den Focus hat.

Also nichts mit Focuslistener und so.

lg
Erwin

Hallo.

Sprich: mein Thread hat keine Ahnung, welche Fenster alle
gerade offen sind, sollte aber wissen, ob IRGENDEINES dieser
Fenster gerade den Focus hat.

Also nichts mit Focuslistener und so.

Nur mal so als Idee: du könntest alle deine Fenster mit Focuslistenern ausstatten. Dann könntest du nachverfolgen, wenn ein Fenster den Fokus verliert, ob ein anderes Fenster ihn bekommen hat, oder der Fokus jetzt bei einer anderen Anwendung ist. Beispielsweise indem du die Anzahl der focusGained und focusLost-Events in einer synchronized-Variablen zählst (synchronized, damit das threadsicher ist).

Sebastian.