Abfrage-Unterbruch beim Minimieren eines Applets

UseTheSource

Grünschnabel
Hallo allerseits

Für ein kleines Applet, das dem Benutzer die Zustände von verschiedenen "Dingen" (z.B. von Geräten oder logischen Teilnehmern) anzeigen soll, welche aus einer Datenbank gelesen und alle 5 bis 15 Sekunden neu ausgelesen werden, suche ich eine Möglichkeit, dieses Refreshen zu unterbrechen, wenn das Applet minimiert bzw. für den Benutzer nicht sichtbar ist. Im Grunde muss ich einfach wissen, wie ich erfahren kann, ob das Applet sichbar ist bzw. eine Möglichkeit etwas auszulösen, wenn es aus dem Sichtfeld verschwindet.

Wichtig ist hierbei vielleicht auch noch der Kontext, in dem das Applet normalerweis laufen soll. Es wir aus einer C++-Anwendung gestartet, die ein Fenster mit einer eingebetteten Browser-Komponente (auf Basis des Internet Explorers) öffnet, das das Applet enthält. Wenn das Applet allerdings nicht mehr gebraucht wird, wird es einfach vom Hauptprogramm überlagert, führt aber seine Anfrage weiterhin aus, obwohl niemanden mehr sieht, was dabei herauskommt. Das führt spätestens dann zu Problemen, wenn auf ein gewissen Anzahl von Stationen das Applet im Hintergrund weiterläuft und man beispielsweise den Server warten will. Dann könnte immer irgend ein Applet gerade an seinem Refresh sein und der Server ist blockiert.

Ich hoffe, jemand kann mir bei diesem Problem weiterhelfen. Schon mal herzlichen Dank im Voraus!

MfG UseTheSource
 
Hat wirklich niemand eine Idee, wie ich das Applet daran hindern könnte, seine Daten abzufragen, wenn es nicht sichtbar ist?

Wenn ich das richtig verstanden habe, wären ja die Methoden start() und stop() eigentlich genau dafür gedacht. Diese würden im AppletViewer auch wunderbar funktionieren, aber sobald das Applet im Browser geöffnet wird, werden diese anscheinend nicht mehr ausgeführt :mad:. Ich nehme mal an, dass daran die browserseitige Implementierung Schuld ist, oder liege ich da falsch?

Wenn es Java-seitig wirklich keine weiteren Möglichkeiten gibt (was ich jetzt mal nicht hoffen möchte), habe ich micht gefragt, ob man wohl über Javascript irgendwie erfahren kann, ob das Browserfenster sichtbar ist. Ich weiss ja, dass das nicht gerade allzu schön wäre, aber mir würde es vorerst ein mal reichen, wenn es funktioniert...

MfG UseTheSource
 
Erst mal herzlichen Dank für die Antwort, aber leider scheint auch bei der addComponentListener() Methode das gleiche Problem aufzutreten wie bei start() und stop(). Im AppletViewer funktionierts wunderbar, aber sobald das Applet im Browser geöffnet wird, werden die Methoden anscheinend nicht mehr aufgerufen (bzw. nur componentShown() beim Starten des Applet).
 
Schreib doch in besagte Methoden einfach mal ein println, und schau mal in die Konsole, ob er im Browser noch in die Methode springt.
Ich selbst bin nicht gerade der Applet-Schreiber, aber ist das nicht immer so ne Sache mit den Berechtigungen?
 
Das Applet ist signiert, daher sollte es ja die nötigen Berechtigungen haben, aber auch wenn nur ein println() drin steht werden die Methoden nicht ausgeführt. Ich vermute mal dass der Browser dem Applet gar nicht mitteilt, das es jetzt nicht mehr sichtbar ist.
 
Am Ende soll das Applet in einer eingebetteten Internet Explorer Komponente laufen, aber getestet habe ich es auch mit dem Firefox und auch dort ist es das gleiche Problem.
 
Naja, viel wird ja noch nicht gemacht, es ist die letzten Zeilen der init() Methode

Code:
    this.addComponentListener(new ComponentListener() {
      public void componentShown(ComponentEvent e) {
        System.out.println("show");
        JOptionPane.showMessageDialog(null, "show", "show", JOptionPane.INFORMATION_MESSAGE);
      }
      public void componentHidden(ComponentEvent e) {
        System.out.println("hide");
        JOptionPane.showMessageDialog(null, "hide", "hide", JOptionPane.INFORMATION_MESSAGE);
      }
      public void componentMoved(ComponentEvent e) {
        System.out.println("move");
        JOptionPane.showMessageDialog(null, "move", "move", JOptionPane.INFORMATION_MESSAGE);
      }
      public void componentResized(ComponentEvent e) {}
    });
 
Zurück