2009-04-02 4 views
2

J'ai un JButton qui, lorsqu'il est pressé, change de couleur d'arrière-plan de l'état actif à la normale:Comment puis-je mieux implémenter un effet de bouton de fondu dans Swing?

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

Je veux effacer la couleur du bouton actif retour à la couleur du bouton normal quand une tâche spécifique a terminé son exécution. J'utilise SwingWorker et je me demandais si quelqu'un pouvait suggérer un moyen efficace de le faire s'il vous plaît?

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: Pour être clair, je suis à la recherche d'un moyen efficace pour estomper les valeurs RVB pour activeButtonColor retour à normalButtonColor, sans avoir à créer un grand nombre d'objets Color. C'est possible? Ou dois-je juste limiter le nombre d'étapes de fondu pour être plus efficace?

Répondre

1

Créez une méthode qui prend 3 arguments, un bouton, un de couleur et de couleur. À l'intérieur de la méthode, créez un swingworker pour exécuter en arrière-plan qui fait le fondu des couleurs.

Ensuite, sur votre actionlistener où vous faites votre travail, avant de faire quoi que ce soit, appelez la méthode de fondu d'actif à normal. Lorsque c'est fait, appelez la méthode de fondu de normal à actif.

Vous vous retrouverez avec 3 monteurs de balanciers dans cette situation. Un pour votre travail, un pour le premier fondu et un pour le dernier fondu.

+0

Bien sûr, c'est génial, mais comment éviter de créer plusieurs objets Color à chaque fois, pendant le fondu. Je pourrais manquer quelque chose ici, mais la couleur semble être immuable. J'ai besoin de changer les valeurs RVB de la couleur que je suppose. – Jon

+0

Créer un tableau d'objets de couleur intermédiaires et le conserver au niveau de la classe? –

0

Les objets de couleur doivent être assez légers; ils sont fondamentalement seulement quatre flotteurs plus une poignée de pointeurs vers des objets préexistants. Si vous voulez vraiment économiser sur l'instanciation de l'objet Color, et vous êtes sûr que les couleurs de début et de fin ne changeront pas, vous pouvez précalculer les objets Color pour la séquence de fondu, mais je suis sûr que vous pouvez les calculer à la volée ainsi, et ne subissent aucune conséquence.

Questions connexes