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

편집 : 그냥 명확하게하기 위해, 내가 Color 대량의 객체를 생성하지 않고, 다시 normalButtonColor-activeButtonColor의 RGB 값을 퇴색 할 수있는 효율적인 방법을 찾고 있어요. 가능한가? 아니면 더 효과적 이도록 페이드 단계의 수를 제한해야합니까?

답변

1

버튼, 색상 및 색상의 3 가지 인자를 취하는 메소드를 만듭니다. 이 방법을 사용하면 색이 바랜 배경에서 실행되는 스윙 워커를 만들 수 있습니다.

다음 작업을 수행 할 actionlistener에서 무엇이든하기 전에 fade 메소드를 활성에서 정상으로 호출하십시오. 완료되면 fade 메소드를 normal에서 active로 호출하십시오.

이 상황에서 3 명의 총 스윙 워커가 사용됩니다. 하나는 작업을위한 것이고, 하나는 첫 번째 페이드 용이고 다른 하나는 마지막 페이드 용입니다.

+0

물론 그렇습니다.하지만 페이드가있는 동안 매번 여러 Color 객체를 만드는 것을 피하는 방법은 무엇입니까? 여기에 뭔가 빠져있을 수도 있지만 Color는 변경되지 않는 것으로 보입니다. 내가 추측하고있는 색의 rgb 값을 변경해야합니다. – Jon

+0

중간 색상 개체의 배열을 만들고 클래스 수준에서 유지 하시겠습니까? –

0

색상 개체는 상당히 가볍습니다. 그것들은 근본적으로 단지 4 개의 수레와 기존 객체에 대한 몇 가지 포인터입니다. Color 객체 인스턴스화를 실제로 저장하려고하고 위의 시작 및 끝 색상이 변경되지 않는다고 확신하는 경우에는 페이드 시퀀스에 대한 Color 객체를 미리 계산할 수 있지만 그 값을 즉시 계산할 수 있습니다. 뿐만 아니라 결과를 겪지 않습니다.