2016-11-13 4 views
0

Ich habe ein Problem mit der Hintergrundfarbe des JtoggleButton dynamisch einstellen. Ich möchte, dass JtoggleButton wie eine LED blinkt, zu einer bestimmten Zeit wie 500ms. Ich habe versucht, auch die paintComponent-Methode zu überschreiben. Aber konnte auch nicht erfolgreich sein. Ich stecke fest. Hier ist mein Code Danke für die Hilfe.Jtogglebutton Hintergrund dynamisch einstellen

Led Klasse:

public class Led extends JToggleButton { 
private Color okColor = Color.GREEN; 
private Color notOkColor = Color.RED; 
private static int BLINK_FREQUENCY=500; 

public Led() { 
    this.setPreferredSize(new Dimension(50, 50)); 
    timer.start(); 
} 

Timer timer=new Timer(BLINK_FREQUENCY, new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
      setBackground(okColor); 
      System.out.println("ok"); 
      try { 
       Thread.sleep(BLINK_FREQUENCY); 
      } catch (InterruptedException e1) { 
       e1.printStackTrace(); 
      } 
      setBackground(notOkColor); 
      System.out.println("notok"); 
    } 
}); 

}

Mainframe-Klasse:

public class MainFrame { 

private JFrame frame; 
private Led led; 
private JPanel panel; 

public MainFrame() { 
    initializeComponents(); 
} 

private void initializeComponents() { 
    frame = new JFrame("Blinking Led"); 
    frame.setSize(400, 400); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    { 
     panel = new JPanel(); 
     led = new Led(); 
     panel.add(led); 
     frame.add(panel); 
    } 

} 

public void setVisible(boolean visible) { 
    frame.setVisible(visible); 
} 

}

+0

1) Für eine bessere Hilfe früher, Posten [MCVE] oder [Kurz, Self Contained, Korrekt Beispiel] (http://www.sscce.org/). 2) Siehe [Erkennung/Behebung für die hängende, nahe Klammer eines Codeblocks] (http://meta.stackexchange.com/q/251795/155831) für ein Problem, das nicht mehr gestört werden konnte. –

+0

Ich bin mir nicht sicher, ob ich richtig verstehe, Sie möchten, dass die Farbe alle 500 ms wechselt oder Sie möchten, dass der Status der Taste wechselt und dann den Farbschalter auslöst? –

+0

Ich möchte die Farbe der Taste alle 500ms wechseln. Staat ist nicht wichtig. –

Antwort

-1

ich nicht den Punkt bei der Verwendung der Timer-Klasse sehen, aber nur eine einfache Gewinde sollte funktionieren

public Led() { 
    this.setPreferredSize(new Dimension(50, 50)); 
    thread.start(); 
} 

Thread thread = new Thread(() -> { 
        while (true) { 
         if (getBackground().equals(notOkColor)) { 
          setBackground(okColor); 
         } else { 
          setBackground(notOkColor); 
         } 
         try { 
          Thread.sleep(BLINK_FREQUENCY); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
        } 
       }); 
+0

:) Danke. Es hat mir sehr geholfen. Hast du eine Idee, es mit der Malmethode zu machen? –

+0

Der Punkt ist GUI-bezogenen Code auf dem EDT .... – Antoniossss

+0

@Antoniossss Nein, es gibt absolut keinen Sinn in einer Klasse, die Sie mit einem ActionListener und ActionEvent, die Sie nie in Ihrem Code verwenden werden. Der korrekte Weg ist das manuelle Aufrufen von revalidate() und repaint() auf EDT mit Hilfe von SwingUtils.invokeLater(), aber in diesem Fall ist nicht einmal das erforderlich. –

1

Es ist fast fertig:

Timer timer=new Timer(BLINK_FREQUENCY, new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
      setBackgroundColor(getBackgroundColor()==okColor ? noOkColor:okColor); 
    } 
    }); 

timer.start(); 
Verwandte Themen