ERLEDIGT
NEIN
NEIN
ANTWORTEN
12
12
ZUGRIFFE
783
783
EMPFEHLEN
-
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!
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13
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(); }
-
16.12.11 17:40 #2
Ich würde erst einmal vermuten, dass dein Programm schon beendet wird noch bevor der Timer starten kann.
Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
Ich dachte der Timer startet irgendwie von allein. Aber is ansich ja logisch dass er erst einmal gestartet werden muss.
-
16.12.11 19:07 #4
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.
Funktioniert super.Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
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(); } } }
Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
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.
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14
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(); }
-
16.12.11 20:15 #6
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.
Dasmüsste also eigentlich so aussehen:Code java:1
new Timer (delay , taskPerformer ).start();
Code java:1
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.Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
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.
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
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?!
-
16.12.11 20:46 #8
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.Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
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.
-
16.12.11 21:18 #10
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.
Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
Ich habe das ganze jetzt so umgebaut
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
public class Timeraus{ Timeraus() { init(); } public void init(){ final Otherclass otherclass = new Otherclass(); int delay = 100; ActionListener taskPerformer = new ActionListener () { public void actionPerformed (ActionEvent evt) { System.out.println("test"); otherclass.running(); } }; new Timer(delay , taskPerformer ).start(); } }
Die Methode in der anderen Klasse wird zwar ausgeführt, jedoch ist das ganze noch nicht so ganz zufriedenstellend. Die Methode welche durch die Timerklasse aufgerufen wird arbeitet sehr unsauber. Das system.out.println("test") wird im übrigen immer 2mal ausgegeben. Warum auch immer. Vielleicht hängt das irgendwie miteinander zusammen.
-
16.12.11 22:23 #12
Erzeugst du vielleicht zwei Timeraus-Objekte? Kann eigentlich nur daran liegen oder du hast die Ausgabe noch in der Methode running() deiner anderen Klasse. Und was heißt "unsauber"?
Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
Nein, mach ich nicht
Das ist auch nicht der Fall
Die Methode die aufgerufen wird zeichnet Vierecke, aber nur wenn eine Variable vom Benutzer in einen Array abgespeichert wird. anhand dieser Variable wird gezeichnet. Jedoch wird nicht alles gezeichnet was gezeichnet werden soll, irgendwie merkwürdig. Ist natürlich etwas schwer zu beurteilen wenn der Code nicht gepostet ist, das sehe ich ein. Aber den zu posten wäre glaub ich ehr nicht sinnvoll.
Ähnliche Themen
-
PDF in Java-Swing anzeigen
Von taban im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 3Letzter Beitrag: 13.01.08, 13:15 -
Frage zur Klasse java.util.Timer
Von takidoso im Forum JavaAntworten: 1Letzter Beitrag: 03.09.07, 15:56 -
Timer erstellen im MFC
Von knapper im Forum VisualStudio & MFCAntworten: 13Letzter Beitrag: 16.08.06, 07:06 -
Rendering Performance von Java 2D / Swing verbessern unter Java 5
Von Thomas Darimont im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 0Letzter Beitrag: 06.02.05, 00:58 -
Animation (Timer-Objekt) in Java?
Von DoedGrv im Forum JavaAntworten: 2Letzter Beitrag: 22.04.02, 17:40





Zitieren
Login





