【问题标题】:How can I best implement a Fade Button Effect in Swing?如何在 Swing 中最好地实现淡入淡出按钮效果?
【发布时间】:2010-10-17 05:21:40
【问题描述】:

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

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

【问题讨论】:

    标签: java user-interface swing awt swingworker


    【解决方案1】:

    创建一个接受 3 个参数的方法,一个按钮,一个从颜色和到颜色。在该方法中,创建一个 swingworker 以在后台运行以淡化颜色。

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

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

    【讨论】:

    • 当然,这很好,但是如何避免在淡入淡出期间每次都创建多个 Color 对象。我可能在这里遗漏了一些东西,但 Color 似乎是不可变的。我需要更改我假设的颜色的 rgb 值。
    • 创建一个中间颜色对象数组并保持在类级别?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 2011-03-05
      • 2011-10-16
      相关资源
      最近更新 更多