Java 如何在Swing中最好地实现淡入淡出按钮效果?

Java 如何在Swing中最好地实现淡入淡出按钮效果?,java,user-interface,swing,awt,swingworker,Java,User Interface,Swing,Awt,Swingworker,我有一个JButton,按下该按钮时,背景颜色会从活动变为正常: final Color activeButtonColor = new Color(159, 188, 191); final Color normalButtonColor = new Color(47, 55, 56); 我想在特定任务完成后将活动按钮颜色淡入正常按钮颜色。我正在使用SwingWorker,想知道是否有人可以建议一种有效的方法来实现这一点 button.addActionListener(new Action

我有一个
JButton
,按下该按钮时,背景颜色会从活动变为正常:

final Color activeButtonColor = new Color(159, 188, 191);
final Color normalButtonColor = new Color(47, 55, 56);
我想在特定任务完成后将活动按钮颜色淡入正常按钮颜色。我正在使用
SwingWorker
,想知道是否有人可以建议一种有效的方法来实现这一点

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();
  }
});
button.addActionListener(新ActionListener(){
已执行的公共无效操作(最终操作事件){
新SwingWorker(){
受保护对象doInBackground()引发异常{
按钮。设置背景(活动按钮颜色);
用于(int note=60;note<120;note++){
midiController.sendMIDI消息(1,note,83);
midiController.stopMIDI消息(注83);
}
睡眠(200);
返回null;
}
受保护的void done(){
试一试{
对象结果=get();
//淡出
}捕获(例外情况除外){
例如printStackTrace();
if(例如java.lang.InterruptedException的实例)
返回;
}
}
}.execute();
}
});

编辑:为了澄清,我正在寻找一种有效的方法,将
activeButtonColor
的RGB值淡入
normalButtonColor
,而无需创建大量
Color
对象。可能吗?还是我只需要限制淡入淡出步骤的数量就可以提高效率?

创建一个包含3个参数的方法,一个按钮、一个“从颜色”和“到颜色”。在该方法内部,创建一个swingworker以在背景中运行,该背景会使颜色褪色

然后,在您执行工作的actionlistener上,在您执行任何操作之前,将fade方法从active调用为normal。完成后,将淡入淡出方法从“正常”调用为“活动”


在这种情况下,您将使用总共3个Swingworker。一个用于您的工作,一个用于第一次淡入淡出,另一个用于最后一次淡入淡出。

颜色对象应该相当轻;它们基本上只是四个浮点数加上一些指向已有对象的指针。如果您真的想保存颜色对象实例化,并且您确信上面的开始颜色和结束颜色不会改变,您可以为淡入序列预计算颜色对象,但我确信您也可以动态计算它们,并且不会产生任何后果。

当然,这很好,但是如何避免每次在淡入淡出时创建多个颜色对象呢。我可能遗漏了一些东西,但颜色似乎是不变的。我需要更改我假设的颜色的rgb值。创建一个中间颜色对象数组并将其保持在类级别?