2

我有一个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();
  }
});

编辑:为了清楚起见,我正在寻找一种有效的方法将 RGB 值淡化activeButtonColornormalButtonColor,而不必创建大量Color对象。是否可以?还是我只需要限制淡入淡出步骤的数量以提高效率?

4

2 回答 2

1

创建一个接受 3 个参数、一个按钮、一个来自颜色和一个颜色的方法。在该方法中,创建一个 swingworker 以在背景中运行以淡化颜色。

然后在你做你的工作的动作监听器上,在你做任何事情之前,调用淡入淡出方法从活动到正常。完成后,将淡入淡出方法从正常调用到活动。

在这种情况下,您最终将使用 3 个摇摆工人。一个用于您的工作,一个用于第一个渐变,一个用于最后一个渐变。

于 2009-04-02T20:39:28.140 回答
0

颜色对象应该是相当轻量级的;它们基本上只是四个浮点数加上一些指向预先存在的对象的指针。如果你真的想保存 Color 对象实例化,并且你确定上面的开始和结束颜色不会改变,你可以为淡入淡出序列预先计算 Color 对象,但我很确定你可以即时计算它们也一样,并且不承担任何后果。

于 2009-04-02T21:31:04.177 回答