Swing Timer in java erstellen

B

ByeBye 249712

Hallo,

Ich habe eine Timer Klasse die in einer anderen Klasse in bestimmten
Abständen eine Methode immer wieder aufrufen soll. Momentan habe ich zu Testzwecken erstmal nen system.out.println("test"); in die actionPerformed-Methode gesetzt.
Irgendwie ist die Timerklasse jedoch nicht ausführbar. Kann jemand helfen, nen Tip geben oder sagen was noch fehlt? Vielen Dank schonmal!

Java:
public class Timer{
   
    int delay = 1000; // milliseconds
   
    ActionListener taskPerformer = new ActionListener () {
    public void actionPerformed ( ActionEvent evt) {
           System.out.println("test");
    }
    };
   
     new Timer (delay , taskPerformer ).start();
 
 }
 
Ich dachte der Timer startet irgendwie von allein. Aber is ansich ja logisch dass er erst einmal gestartet werden muss.
 
Das Problem ist nicht der Start des Timers, der wird schon seinen Job machen. Das Problem ist eher, dass das Programm bereits vorher beendet wird, weil es fertig ist. Dein Programm muss also irgendwie geblockt werden, z.B. mit einer grafischen Oberfläche oder einer anderweitigen Abarbeitung, die verhindert, dass das Programm sich von selbst beendet. Das kann z.B. das Warten auf Benutzeraktionen sein.

EDIT:
Hab vorhin übrigens mal nen Beispiel gebastelt.
Java:
package de.tutorials.forum.help.celtx.timer;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.TimeUnit;

import javax.swing.Timer;

public class TimerSample {
	public static void main(String[] args) {
		new Timer(1000, new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("foobar");
			}
		}).start();

		try {
			TimeUnit.SECONDS.sleep(5);
		} catch(InterruptedException e1) {
			e1.printStackTrace();
		}
	}
}
Funktioniert super.
 
Mein Programm wartet auf Benutzereingaben und hat eine grafische Oberfläche. Es beendet sich nicht von selbst. Ich hatte bei meinem Code das javax.swing.Timer-package vergessen zu importieren. Jetzt habe ich zwar keine Fehlermeldungen mehr aber funktionieren tut es trotzdem nicht. Habe mal deinen Code in mein Programm eingebunden. Allerdings harmoniert dass nicht weil ich ja schon eine Klasse habe in der die Main-Methode ausgeführt wird und wenn ich die Main weglasse kann ich mitttelfristig die Fehlermeldungen nicht wegbekommen.
Ich will ja von einer anderen Klasse eine Methode immer wieder aufrufen lassen. So sieht das momentan bei mir aus, aber es funktioniert noch nicht. Ich schätze mal das es nur ne Kleinichkeit ist die fehlt, aber ich komm nicht drauf.

Java:
public class Timer{
   
    int delay = 1000; // milliseconds
   
    ActionListener taskPerformer = new ActionListener () {
    public void actionPerformed ( ActionEvent evt) {
         Otherclass otherclass = new Otherclass();
        otherclass.running();
    }
    };
   
     new Timer (delay , taskPerformer ).start();
 
 }
 
Wenn dein Code wirklich so aussieht, dann müsste es eigentlich bereits beim Kompilieren knalln o_O Und wenn deine Klasse auch Timer heißt, dann wird es schon daran scheitern, da der Name durch ein Import doppelt belegt ist.

Das
Java:
new Timer (delay , taskPerformer ).start();
müsste also eigentlich so aussehen:
Java:
new javax.swing.Timer (delay , taskPerformer ).start();

So, aber auch dann wird's knalln, weil der Aufruf nicht einfach so mitten in einer Klasse stehen kann. Da gehört ein Block drumrum, der die Anweisung ausführen kann, z.B. eine Methode (z.B. main).

Außerdem vermute ich, dass du ein eher ungewolltes Verhalten bekommen wirst, wenn der Timer loslegt, denn bei jedem Durchlauf erzeugst du ein neues Objekt deiner anderen Klasse. Kann sein, dass es funktionieren wird, aber ich vermute mal, dass deine Klasse auch irgendeine Art Zustand hält bei bei jedem Methodenaufruf etwas mit dem Zustand geschehen soll.

Und es wäre schön, wenn du nach Möglichkeit deinen richtigen Code posten könntest. Ich habe oft die Erfahrung gemacht, dass die Leute nicht ihren richtigen Code posten, sondern irgend einen Code, der das Problem darstellen "sollte". Leider ist es oft so gewesen, dass es nicht über das "sollte" hinaus kam, weil die Codes nicht identisch waren. Ultra geheime Sachen sollst du natürlich nicht posten, aber wenn's geht auch nix erfundenes.
 
Also der Code ist schon der Richtige. Der gibt genau das wieder was ich bei mir auch habe.
Die Klasse hat jetzt auch einen anderen Namen, so dass es hier auch keine Probleme mehr geben sollte. Danke an dieser Stelle für den Hinweis.

Java:
public class Timeraus{

    
    Timeraus() {
        init();
    }

    public void init(){
       
    int delay = 1000; 
    ActionListener taskPerformer = new ActionListener () {
    public void actionPerformed (ActionEvent evt) {
       
       Otherclass otherclass = new Otherclass();
        otherclass.running();
    }
    };
   new Timer(delay , taskPerformer ).start();
  }
}

Die Frage ist jetzt was hier drumrum gehört. Wäre es nicht vielleicht doch nötig die Timerklasse igendwo aufzurufen. Dann müsste sie doch laufen?!
 
Jetzt ist der Code richtig. In deinen vorherigen Posts gab es die Methode init() nicht, die den Code umschlossen hat. Jetzt passt das.

Ähm... Ja, du musst natürlich eine Instanz von deiner Klasse Timeraus erzeugen, damit der entsprechende Code und somit auch der Timer überhaupt anlaufen.
 
Ich habe eine Start methode drumrum gebaut. Damit lässt sich der Timer von der Mainklasse aus starten. Jedoch hattest du recht mit dem Problem das ich ja bei jedem Durchlauf des Timers ein neues Objekt der anderen Klasse erzeuge. Wenn du da eine Lösung weist wäre ich dir dankbar. Ich probiere inzwischen selber noch etwas herum.
 
Nimm die Deklaration und vor allem die Erzeugung deines Objektes aus dem Timer raus und verschied das von mir aus in die init()-Methode, wenn diese dannach nicht mehr aufgerufen wird. Ansonsten kannst du dein Objekt auch als Eigenschaft der Klasse deklarieren. Aber wie gesagt, der interessante Part ist eigentlich das Erzeugen des Objektes.
 
Zurück