2014-10-22 3 views
1

목표는 1 초 동안 jbutton의 배경을 빨간색으로 설정하고 0.5 초 후에 jbutton이 정상으로 돌아가는 함수를 만드는 것입니다. 이 작업을 질수 .. 이 제 기능jbutton을 켜고 끕니다.

private void paint(final int num){ 
     Timer timer = new Timer(500, new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (num == 1){ 
       btn.setBackground(Color.black); 
       } 
      } 
     }); 
     timer.start(); 
    } 
+0

Thread.sleep을 사용해 보셨나요? 예 : btn.setBackground (Color.red); Thread.sleep (1000); btn.setBackground (Color.black); –

+0

시도해 보았습니다. 작동하지 않습니다. – Erez

+0

스윙의 오라클 튜토리얼 concurency에서 스윙 타이머 만 사용하는 경우가 많기 때문에 여기에서 모든 대답을 무시하십시오. – mKorbel

답변

1

시작이 꺼질 때 두 가지를 할 것은 500ms 타이머 :
는 - 빨간색
에 색상을 변경 - 변경하는 1 초 타이머를 시작합니다 색이 이면 정상적으로이됩니다.

+0

멋진 아이디어와 작업. 하지만 2 타이머가없는 다른 방법이 있다고 생각했습니다. – Erez

0

음,이 작업을 수행 할 것입니다. (참고로, 첫 번째 잠의 코드를 타이머에 넣거나 실제 응용 프로그램에서 자체 스레드를 사용하여 코드를 실행하는 스레드 차단) :

public static void main(String[] args) throws Exception { 
    final JFrame jf = new JFrame(); 
    final JButton jButton = new JButton("Hello"); 
    final Color originalBackground = jButton.getBackground(); 

    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
      jf.getContentPane().add(jButton); 
      jf.pack(); 
      jf.setVisible(true); 
     } 
    }); 

    Thread.sleep(500); 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      jButton.setBackground(Color.RED); 
     } 
    }); 
    Thread.sleep(1000); 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      jButton.setBackground(originalBackground); 
     } 
    }); 
+0

Thread.sleep은 UI 스레드를 차단합니다. – alterfox

+1

UI 스레드에서 실행되지 않기 때문에 불가능합니다. invokeLater() 내부의 항목 만 있습니다. 잠은 주 스레드에 있습니다. – BarrySW19

+0

사실 그것은 아마도 그렇게 할 것입니다. 작동하는 예제를 만들었지 만 실생활에서는 사용할 수 없습니다. 버튼이 색상을 변경하도록 주 스레드를 실제로 차단하지 않습니까? – alterfox

관련 문제