代码之家  ›  专栏  ›  技术社区  ›  Jonathan Holloway

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

  •  2
  • Jonathan Holloway  · 技术社区  · 15 年前

    我有一个 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 回到 normalButtonColor ,而不必创建大量 Color 物体。有可能吗?还是只需要限制淡入淡出的步数就可以提高效率?

    2 回复  |  直到 15 年前
        1
  •  1
  •   John Ellinwood    15 年前

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

    然后在你的actionListener上,在你做任何事情之前,从active调用fade方法到normal。完成后,将Fade方法从Normal调用为Active。

    在这种情况下,总共有3名工人在工作。一个用于您的工作,一个用于第一个淡入淡出,一个用于最后一个淡出。

        2
  •  0
  •   Paul Brinkley    15 年前

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