2009-04-02 6 views
2

Ich habe eine JButton die, wenn sie gedrückt, Hintergrundfarbe von der aktiven in den normalen ändert:Wie kann ich am besten einen Fade Button Effekt in Swing implementieren?

final Color activeButtonColor = new Color(159, 188, 191); 
final Color normalButtonColor = new Color(47, 55, 56); 

Ich möchte die aktive Schaltfläche Farbe verblassen wieder in die normale Taste Farbe, wenn eine bestimmte Aufgabe ausführt beendet hat. Ich benutze SwingWorker und fragte mich, ob jemand einen effizienten Weg vorschlagen könnte, dies bitte zu tun?

button.addActionListener(new ActionListener() { 
    public void actionPerformed(final ActionEvent event) { 

    new SwingWorker<Object, Object>() { 

     protected Object doInBackground() throws Exception { 
     button.setBackground(activeButtonColor); 
     for (int note = 60; note < 120; note++) { 
      midiController.sendMidiMessage(1, note, 83); 
      midiController.stopMidiMessage(note, 83); 
     } 
     Thread.sleep(200); 
     return null; 
     } 

     protected void done() { 
     try { 
      Object result = get(); 

      // Fade back 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      if (ex instanceof java.lang.InterruptedException) 
      return; 
     } 
     } 
    }.execute(); 
    } 
}); 

EDIT: Nur um klar zu sein, ich bin für einen effizienten Weg, um die RGB-Werte für activeButtonColor zurück zu normalButtonColor, verblassen, ohne eine große Anzahl von Color Objekten erstellen zu müssen. Ist es möglich? Oder muss ich nur die Anzahl der Überblendungsschritte begrenzen, um effizienter zu sein?

Antwort

1

Erstellen Sie eine Methode, die 3 Argumente, eine Schaltfläche, eine von Farbe und Farbe verwendet. Erstellen Sie in der Methode einen Swingworker, der im Hintergrund ausgeführt wird und die Farben verblasst.

Dann auf Ihrem actionlistener, wo Sie Ihre Arbeit tun, bevor Sie irgendetwas tun, rufen Sie die Fade-Methode von aktiv zu normal. Wenn es fertig ist, rufen Sie die Fade-Methode von normal zu aktiv auf.

Sie werden mit insgesamt 3 Swingworkern in dieser Situation enden. Eine für Ihre Arbeit, eine für die erste Überblendung und eine für die letzte Überblendung.

+0

Sicher, das ist großartig, aber wie vermeide ich es, jedes Mal mehrere Color-Objekte während der Fade zu erstellen. Ich könnte hier etwas vermissen, aber Farbe scheint unveränderlich zu sein. Ich muss die RGB-Werte der Farbe ändern, die ich annahm. – Jon

+0

Erstellen Sie ein Array von Zwischenfarbobjekten und behalten Sie es auf Klassenebene? –

0

Farbobjekte sollten ziemlich leicht sein; Sie sind im Grunde nur vier Floats plus eine Handvoll Zeiger auf bereits existierende Objekte. Wenn Sie wirklich bei der Instanziierung von Farbobjekten sparen möchten und sicher sind, dass sich die Anfangs- und Endfarben nicht ändern, könnten Sie die Color-Objekte für die Fade-Sequenz vorberechnen, aber ich bin mir ziemlich sicher, dass Sie sie spontan berechnen können ebenso, und erleiden keine Konsequenzen.