Swing Beenden eines ActionListener über einen Button

Fendrill

Mitglied
Hallo zusammen,

ich experimentiere gerade mit SWING und habe ein Tutorial durchgeklickt und versuche nun das zu erweitern.

Das Ziel ist, dass ich den Text des Start-Button ändere in „Stop“ (was auch funktioniert), dann versuche ich beim nächsten Klicken des gleichen Buttons den Timer zu stoppen – und das funktioniert nicht.

Ich habe schon versucht mit RemoveActionHandler und Timer.stop zu arbeiten, habe aber keinen Erfolg.

Wäre super, wenn mir jemand einen Tipp hätte, was ich falsch mache.

Danke und Gruß
Markus



Mein Quellcode:

Java:
    private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:


//  startButton.setEnabled( false );

  final long start = System.currentTimeMillis();
  final long end   = start + minutesSlider.getValue() * 60 * 1000;

  final Timer timer = new Timer(100, null );

  timer.addActionListener( new ActionListener() {
    public void actionPerformed( ActionEvent e ) {
      long now = System.currentTimeMillis();
      if ( now >= end )
      {
        remainingMinLabel.setText( "" );
        startButton.setEnabled( true );
        JOptionPane.showMessageDialog( null, "BING!" );
        timer.stop();
      }
      else
          remainingMinLabel.setText( (end - now) / 1000 + " Sekunden");
    }
  } );

  if (startButton.getText().equals("Start") )
        {
            timer.start();
            startButton.setText("Stop");
        }
 else
  {
      remainingMinLabel.setText( "" );
      JOptionPane.showMessageDialog( null, "STOP!" );
      timer.stop();
      startButton.setText("Start");
 }


//    startButton.setEnabled( true );
    }
 
den Timer musst du längerfristig merken, in einem Klassenattribut,
bei stop() keinen neuen Timer erstellen,

z.B. so
Java:
private Timer t = null;

actionPerformed() {
if (stop) {
  t.stop();
  aendere Button zu start
} else {
   t = new Timer() ... usw.
   t.start();
   aendere Button zu stop
}
}
 
das funktioniert nicht: wenn ich den Timer erst in der "actionPerformed"-Methode anlegen, kann ich ja davor keinen actionListener anlegen... ???:L
 
menno, das hast du doch bisher auch schon, dann etwas ausführlicher:

Java:
private Timer t = null;

startButtonActionPerformed() {
if (stop) {
  t.stop();
  aendere Button zu start
} else {
   t = new Timer() ... usw. mit actionPerformed() des Timers usw., 20 Zeilen
   t.start();
   aendere Button zu stop
}
}
nun klarer? alles wie du am Anfang auch schon fast hast,
im wesentlichen der Timer in das if verschoben und vor allem ein Klassenattribut
 
soweit klar - hab ich ja schon versucht... aber wenn ich "private Timer t = null;" einfüge, poppen tausend Fehlermeldung hoch mit dem Hinweis in dieser Zeile "illegal start of expression"

auch mit public davor funktioniert es nicht...

Danke für deine Hilfe!
 
soweit klar - hab ich ja schon versucht... aber wenn ich "private Timer t = null;" einfüge, poppen tausend Fehlermeldung hoch mit dem Hinweis in dieser Zeile "illegal start of expression"

auch mit public davor funktioniert es nicht...

Danke für deine Hilfe!

Ich denke mal dann hast du dich vertippt, weil private Timer t = null; sollte aufjedenfall funktionieren.
 
ich habe mich nicht vertippt - habe mal einen Screenshot angehängt - vielleicht erkennst Du ja das Problem...
 

Anhänge

  • Screenshot.JPG
    Screenshot.JPG
    61,5 KB · Aufrufe: 60
SlaterB hat dir den Code gegeben, dass der Timer VOR bzw, NACH der startButtonActionPerformed(); Methode benutzt wird und NICHT IN der Methode.
 

Zurück
Oben