# blinkender Button



## MQue (21. Apr 2009)

Hallo,

ich hab einen blinkenden Button realisiert und er funkt. auch. Was noch nicht passt ist, das der Button ziemlich unregelmäßig blinkt, ich vermute da mein Programm noch einiges an anderen Sachen nebenher macht.
Gibt es eine Möglichkeit, dass der Button regelmäßiger blinkt?

Vielen Dank,




```
thread = new Thread () {
        @Override
        public void run () {
            while(true) {                                              
                       if (button.getBackground() == elementState.getLowerColor())                                                     
                           button.setBackground (elementState.getBgColor());
                       else                                                  
                           button.setBackground (elementState.getLowerColor());                                                    
                      try {
                           Thread.sleep(2000);
                          }
                      catch (InterruptedException e) {}
                      button.repaint();
                      }
                 }
            };
  thread.setPriority(1);
  thread.start();
```


----------



## Gast2 (21. Apr 2009)

Du dafst halt nirgends in deinem Programm den EDT blockieren sonst blinkt der Button natürlich nicht mehr...

Probiers mal so...

```
import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class ButtonDemo extends JFrame {

    public ButtonDemo() {

        final JButton button = new JButton();
        button.setBackground(Color.BLACK);
        Thread thread = new Thread() {

            @Override
            public void run() {
                while (true) {
                    SwingUtilities.invokeLater(new Runnable() {

                        public void run() {
                            if (button.getBackground() == Color.BLACK)
                                button.setBackground(Color.RED);
                            else
                                button.setBackground(Color.BLACK);
                        }

                    });
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                    }
                    button.repaint();
                }
            }
        };

        thread.setPriority(1);
        thread.start();
        add(button);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new ButtonDemo();
    }

}
```


----------



## Ebenius (21. Apr 2009)

Bitte! Keine Threads für billige UI-Jobs. Für's Blinken drängt sich doch der javax.swing.Timer förmlich auf: 
	
	
	
	





```
new javax.swing.Timer(100, new ActionListener() {
  private final Color color1 = Color.GREEN;
  private final Color color2 = Color.RED;

  public void actionPerformed(ActionEvent e) {
    if (color1 == button.getBackground()) {
      button.setBackground(color2);
    } else {
      button.setBackground(color1);
    }
  }
}).start();
```
 (Achtung, der automatisch generierte Link im Quelltext führt irreführender Weise zum java.util.Timer und nicht zum javax.swing.Timer)

Ebenius


----------



## Tobias (21. Apr 2009)

Oder wenn man das Ganze nicht zu Fuß machen will (etwa weil später noch viel mehr passieren soll): https://timingframework.dev.java.net/


----------



## Ebenius (21. Apr 2009)

Tobias hat gesagt.:


> Oder wenn man das Ganze nicht zu Fuß machen will (etwa weil später noch viel mehr passieren soll): https://timingframework.dev.java.net/


Auch das wäre für einen blinkenden Button völlig übertrieben. Mein Quelltext oben ist ein Einzeiler. Was will ich da mit einer Timing-Bibliothek?

Ebenius


----------



## Tobias (21. Apr 2009)

Deshalb mein Hinweis in Klammern. Nur für einen blinkenden Button ist das übertrieben.


----------

