tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
783
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    celtx celtx ist offline Mitglied Bronze
    Registriert seit
    Nov 2010
    Beiträge
    48
    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();
     
     }
     

  2. #2
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    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 ;)

  3. #3
    celtx celtx ist offline Mitglied Bronze
    Registriert seit
    Nov 2010
    Beiträge
    48
    Ich dachte der Timer startet irgendwie von allein. Aber is ansich ja logisch dass er erst einmal gestartet werden muss.
     

  4. #4
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    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.
    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();
            }
        }
    }
    Funktioniert super.
     
    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 ;)

  5. #5
    celtx celtx ist offline Mitglied Bronze
    Registriert seit
    Nov 2010
    Beiträge
    48
    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();
     
     }
     

  6. #6
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    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
    Code java:
    1
    
    new Timer (delay , taskPerformer ).start();
    müsste also eigentlich so aussehen:
    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 ;)

  7. #7
    celtx celtx ist offline Mitglied Bronze
    Registriert seit
    Nov 2010
    Beiträge
    48
    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?!
     

  8. #8
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    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 ;)

  9. #9
    celtx celtx ist offline Mitglied Bronze
    Registriert seit
    Nov 2010
    Beiträge
    48
    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.
     

  10. #10
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    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 ;)

  11. #11
    celtx celtx ist offline Mitglied Bronze
    Registriert seit
    Nov 2010
    Beiträge
    48
    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.
     

  12. #12
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    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 ;)

  13. #13
    celtx celtx ist offline Mitglied Bronze
    Registriert seit
    Nov 2010
    Beiträge
    48
    Zitat Zitat von Akeshihiro Beitrag anzeigen
    Erzeugst du vielleicht zwei Timeraus-Objekte?
    Nein, mach ich nicht

    Zitat Zitat von Akeshihiro Beitrag anzeigen
    oder du hast die Ausgabe noch in der Methode running()
    Das ist auch nicht der Fall

    Zitat Zitat von Akeshihiro Beitrag anzeigen
    Und was heißt "unsauber"?
    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

  1. PDF in Java-Swing anzeigen
    Von taban im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 13.01.08, 13:15
  2. Frage zur Klasse java.util.Timer
    Von takidoso im Forum Java
    Antworten: 1
    Letzter Beitrag: 03.09.07, 15:56
  3. Timer erstellen im MFC
    Von knapper im Forum VisualStudio & MFC
    Antworten: 13
    Letzter Beitrag: 16.08.06, 07:06
  4. Rendering Performance von Java 2D / Swing verbessern unter Java 5
    Von Thomas Darimont im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 06.02.05, 00:58
  5. Animation (Timer-Objekt) in Java?
    Von DoedGrv im Forum Java
    Antworten: 2
    Letzter Beitrag: 22.04.02, 17:40