Kennt sich wer mit Java aus?^^

07/22/2013 22:56 South-Park#1
Brauche Hilfe bei nem java-Problem hock da schon Stunden dran und keiner konnte mir helfen^^

Ich zeig euch mal die Stellen:
Code:
//Autosave-Timer
        autosave.addActionListener(new ActionListener() {
            @Override
            @SuppressWarnings({"SleepWhileInLoop", "WaitWhileNotSynced"})
            public void actionPerformed(ActionEvent ae) {
                if (autosave.isSelected()) {
                    if (!timerstart) {
                            autoSaveTimer();
                            timerstart = true;
                    } else {
                    }
                } else {
                    autosaveL.setText("Autosave beendet!");
                }
            }
        });
und die Methoden:
Code:
   public void autoSaveTimer() {
        System.out.println("1. Timermeldung");
        autosaveL.setText("Autosave gestartet! So oft "
                + "wurde bisher gespeichert: "
                + Integer.toString(autosaveZaehler) + " mal.");
        do {
            timerstart = true;
            timerfinish = false;
            System.out.println("Timerfinish am Anfang ist " + timerfinish);
            System.out.println("Timerstart ist am Anfang " + timerstart);
            System.out.println("Timer wird gestartet");
            timer.schedule(timerTask, 1);
            if (timerfinish) {
                System.out.println("2.Timermeldung");
                continue;
            } else {
                System.out.println("Das darf hier garnicht stehen");
                continue;
            }
        } while (timerfinish);
    }
    
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            autosaveZaehler++;
            autosaveL.setText("Autosave gestartet! So oft "
                    + "wurde bisher gespeichert: "
                    + Integer.toString(autosaveZaehler) + " mal.");
            System.out.println("Zeit ist um");
            timer.cancel();
            timerfinish = true;
            timerstart = false;
            System.out.println("Timerfinish in run() = " + timerfinish);
            System.out.println("Timerstart in run = " + timerstart);
        }
    };
Was es machen soll: ("autosave" ist ein JCheckBoxMenuItem)
Wenn das Häckchen drin ist, soll das Label alle X Sekunden die Zahl um eins hochzählen.
Leichter gesagt als getan, brauch Hilfe^^ letzte Hoffnung waren die Continue, aber leider nein. Er watet einfach nciht, bis der Timer fertig ist, sondern startet ihn und macht dann den rest, dadurch wird die while Schleife ja abgebrochen, weil "timerfinish" noch false ist.
Mithilfe der ganzen Outputs wollte ich mir ne Fehlerquelle suchen, hat ja auch geklappt^^
Hilfe^^
07/23/2013 02:10 omer36#2
Quote:
timer.schedule(timerTask, 1);
so wird der timer doch garnicht gestartet, hinter der 1 fehlt noch ein parameter.
hatte zwar ewig kein java mehr, aber vllt. hilft das ja weiter:

Code:
  
  public void jCheckBox1_ActionPerformed(ActionEvent evt) {
    t.schedule(new checked(), 0, 1000);  //beim checkboxklick wird direkt der timer ausgeführt ( 0 ) und dies jede sec. ( 1000 )
    System.out.println("x");
    System.out.println("xx");            // das wird alles parallel zum timer ausgeführt
    System.out.println("xxx");
  }
  
  class checked extends TimerTask {
    public void run() {
      jLabel1.setText(Integer.toString(zae));
      zae += 1;

      if (zae >= 5){   //hier die abbruch bedingung
        t.cancel();
        System.out.println("timer ende..");      //das passiert nach dem timer
      }

    }
  }
falls was völlig daneben ist, bitte ich das zu entschuldigen...habe wie gesagt ewig nicht mit java programmiert
07/23/2013 13:38 dowhile#3
Hi,

der Timer wird in einem neuen Thread, d.h. parallel zu deinem restlichen Code ausgeführt. Der Aufruf von timer.shedule() wartet daher nicht, bis der Timer-Code abgearbeitet wurde.

Neben dem Timer, den du nutzt, gibt es übrigens auch einen Timer in javax.swing.Timer, der mit einem ActionListener arbeitet und eine start()/stop()-Methode bietet. Du könntest auch einen solchen Timer anlegen und immer, wenn der Menüpunkt (de)aktiviert wird, starten bzw. stoppen.

Quasi so:

... Konstruktor:
Quote:
timer = new javax.swing.Timer(delay:int, new java.awt.event.ActionListener() { public void actionPerformed() { ... dein Code ... } });
... ActionListener des Menüpunkts:
Quote:
if (autosave.isSelected()) { timer.start(); } else { timer.stop(); }
07/23/2013 20:05 South-Park#4
habs schon gelöst, aber danke :) habs btw anders gelöst, mit 2 inneren Klassen



und @omer: er wurde gestartet, jedoch nur einmal :P