# javax.swing.Timer: wie stoppen???



## zubi (5. Mai 2004)

Hallo,

habe einen Timer folgendermassen in Gebrauch:

```
java.awt.event.ActionListener taskPerformer = new java.awt.event.ActionListener() {
            boolean isVisible = true;
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                if (isVisible = !isVisible) {
                    statusLabel.setIcon(null);
                } else {
                    setIcon(image);
                }
           }
        };
        timer = new javax.swing.Timer(300, taskPerformer);
        timer.start();
```

Der Timer lässt ein Icon blinkend erscheinen. Nun will ich das Ding per Mausklick wieder zum Stillstand bringen:

```
private void stopBlinking() {
        if (timer.isRunning()) {
            timer.stop();
            frames.dialog.pack();
            frames.dialog.show();
        }
    }
```

Der Code wird schön durchlaufen (Event wird also abgefangen), nur lässt sich der Timer so nicht stoppen!!?!!

Hat jemand eine Idee an was das liegen könnte?

Danke & gruss
zubi


----------



## zubi (8. Mai 2004)

kann mir hier wirklich niemand helfen? ich bring den timer einfach nicht zum stehen...


----------



## baumbart (8. Mai 2004)

Moin,
wo und wie fänsgt du denn den Mausklick ab?


----------



## Roar (8. Mai 2004)

baumbart hat gesagt.:
			
		

> Moin,
> wo und wie fänsgt du denn den Mausklick ab?


darf ich wissen was das bitte mit der fragestellung zu tun hat?

@zubi: ich wüsste nicht wieso das nicht per stop gehen sollte. wird stop denn auch aufgerufen?


----------



## zubi (9. Mai 2004)

@baumbart: mit MousePressed, MouseClicked und MouseReleased.

@roar: im debugger wird der event abgefangen und stopBlinking() wird ohne fehler durchlaufen.

ich seh' das schon richtig oder: wird der Timer gestoppt, werden keine events mehr erzeugt, wodurch das blinken (in meinem fall) aufhören sollte?

gruss,
zubi


----------



## baumbart (9. Mai 2004)

Sehe ich genauso zubi. Wäre es möglich, dass timer.isRunning() aus irgendeinem Grund false zurück liefert? Ich weis, das ist sehr unwahrscheinlich aber das einzige was mir einfällt.

Kannst du auch ein bischen mehr Code zeigen oder ist der zu umfangreich?

Gruß Fangorn

@Roar:  Um auf deine Frage zu Antworten: Nein darfst du nicht.
Und wenn du schon andere User kritisierst, dann tue das doch bitte _nach_ deinem Posting.


----------



## Illuvatar (9. Mai 2004)

@zubi
Falls es dir hilft: Folgender Code funktioniert bei mir:

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class IconBlinkTest extends JFrame
{
  public IconBlinkTest (String title)
  {
    super (title);
    setSize(300, 300);
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());
    final ImageIcon ii = new ImageIcon ("IconBlinkTest.gif");
    final JLabel jlab = new JLabel (ii);
    cp.add ("Center", jlab);
    setDefaultCloseOperation (EXIT_ON_CLOSE);
    ActionListener taskPerformer = new ActionListener() {
      boolean isVisible = true;
      public void actionPerformed(java.awt.event.ActionEvent evt)
      {
        if (isVisible = !isVisible) {
          jlab.setIcon(null);
        } else {
          jlab.setIcon (ii);
        }
      }
    };
    final Timer timer = new Timer(300, taskPerformer);
    timer.start();
    setVisible(true);
    addMouseListener (new MouseAdapter(){
      private void stopTimer()
      {
        if (timer.isRunning()) {
          timer.stop();
        }
      }
      public void mousePressed (MouseEvent x)
      {
        stopTimer();
      }
      public void mouseReleased (MouseEvent x)
      {
        stopTimer();
      }
      public void mouseClicked (MouseEvent x)
      {
        stopTimer();
      }
    });
  }
  public static void main (String[] args) {
    new IconBlinkTest("IconBlinkTest");
  }
}
```

@baumbart
Die Kritik war imho berechtigt.


----------



## zubi (10. Mai 2004)

Ich hab' den Fehler gefunden, versteh' ihn jedoch nicht wirklich...

Bisher hab' ich den Timer als Instanzvariable folgendermassen deklariert

```
private javax.swing.Timer timer;
```
und ihn (wie im ersten Post ersichtlich) mit

```
timer = new javax.swing.Timer(300, taskPerformer);
```
initialisiert.

Da Illuvatar den Timer als final deklariert hat, hab' ich das auch mal getan (wieder als Membervariable):

```
private java.awt.event.ActionListener taskPerformer;
private final javax.swing.Timer timer = new javax.swing.Timer(400, taskPerformer = new java.awt.event.ActionListener() {
            boolean isVisible = true;
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                if (isVisible = !isVisible) {
                    statusLabel.setIcon(null);
                } else {
                    statusLabel.setIcon(image);
                }
           }
        });
```

Und so funktioniert's auch bei mir (auch wenn ich die Initialisierung nicht sonderlich schön finde...)! Ich habe keine Ahnung weshalb mein Vorgehen von oben nicht funkionieren soll!

Kann mir jemand auf die Sprünge helfen?

gruss,
zubi


----------



## Illuvatar (10. Mai 2004)

Wenn du den Timer vorher nicht final hattest, hättest du hier:


			
				zubi hat gesagt.:
			
		

> ```
> if (timer.isRunning()) {
> timer.stop();
> ```


nicht auf die Variable zugreifen können, d.h. wahrscheinlich, dass
*du aus Versehen bisher immer auf eine zweite, andere Instanz von Timer zugegriffen hast*.


----------



## zubi (10. Mai 2004)

das hab' ich mir auch überlegt, nur: wo soll die zweite Instanz erzeugt werden? Timer kommt nur in einer Methode vor, und diese wird nur einmal aufgerufen...

ist mir irgendwie alles schleierhaft...


----------

