2009-04-02 24 views
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(); 
    } 
}); 

EDIT:ただ明確にするために、私はColorオブジェクトの膨大な数を作成することなく、バックnormalButtonColorからactiveButtonColorのためのRGB値をフェードするための効率的な方法を探しています。出来ますか?または、フェードステップの数を制限して、より効率的にする必要がありますか?

答えて

1

3つの引数、ボタン、色から色を取得するメソッドを作成します。このメソッドの中で、色のフェードを行うバックグラウンドで実行するスイングワーカーを作成します。

次に、何かをする前に自分の作業を行っているアクションリスナに、fadeメソッドをアクティブから通常に呼び出します。完了したら、fadeメソッドをnormalからactiveに呼び出します。

この状況では、合計3人のスイングワーカーが使用されます。あなたの仕事のためのもの、最初のフェードのためのもの、そして最後のフェードのためのもの。

+0

これは素晴らしいことですが、フェード中に毎回複数のColorオブジェクトを作成しないようにするにはどうすればよいですか。私はここで何かを見逃しているかもしれないが、Colorは不変であるようだ。私は仮定している色のRGB値を変更する必要があります。 – Jon

+0

中間色オブジェクトの配列を作成し、それをクラスレベルに保ちますか? –

0

カラーオブジェクトはかなり軽量でなければなりません。基本的には4つの浮動小数点数に加えて、既存のオブジェクトへのポインタがいくつかあります。実際にColorオブジェクトのインスタンシエーションを保存したい場合、上記の開始と終了の色が変わらないことを確信している場合は、フェードシーケンスのColorオブジェクトを事前に計算できますが、その場で計算することができます同様に、結果に影響を受けません。

関連する問題