2010-03-21 5 views
0

벨로우 (Bellow)는 가장 간단한 GUI 카운트 다운 코드입니다. 스윙 타이머를 사용하여 더 짧고 우아한 방식으로 동일한 작업을 수행 할 수 있습니까?스윙 타이머를 사용하면보다 우아한 방법으로 작업을 수행 할 수 있습니까?

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class CountdownNew { 

    static JLabel label; 

    // Method which defines the appearance of the window. 
    public static void showGUI() { 
     JFrame frame = new JFrame("Simple Countdown"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     label = new JLabel("Some Text"); 
     frame.add(label); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    // Define a new thread in which the countdown is counting down. 
    public static Thread counter = new Thread() { 

     public void run() { 
      for (int i=10; i>0; i=i-1) { 
       updateGUI(i,label); 
       try {Thread.sleep(1000);} catch(InterruptedException e) {}; 
      } 
     } 
    }; 

    // A method which updates GUI (sets a new value of JLabel). 
    private static void updateGUI(final int i, final JLabel label) { 
     SwingUtilities.invokeLater( 
      new Runnable() { 
       public void run() { 
        label.setText("You have " + i + " seconds."); 
       } 
      } 
     ); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       showGUI(); 
       counter.start(); 
      } 
     }); 
    } 

} 

답변

4

예 스윙 타이머를 사용해야합니다. 유틸리티 타이머와 타이머 태스크를 사용하면 안됩니다.

스윙 타이머가 작동하면 코드가 EDT에서 실행되므로 label.setText() 메소드 만 호출하면됩니다.

uitl Timer 및 TimerTask를 사용할 때 코드는 EDT에서 실행되지 않습니다. 즉 코드가 EDT에서 실행되는지 확인하기 위해 SwingUtilities.invokeLater에 코드를 래핑해야합니다.

스윙 타이머를 사용하는 것이 현재 접근 방식보다 더 짧고 우아합니다. 코드가 EDT에서 실행되기 때문에 코딩이 간단 해집니다.

0

당신은 적절한 TimerTaskTimer를 사용하여 좀 더 우아한 만들 수 있습니다.

0

예, 타이머를 사용하십시오. updateGUI는 타이머 작업을위한 코드이지만 run() 메소드를 얻은 이후로 각 호출에 대해 i를 전달할 수 없기 때문에 약간의 변경이 필요합니다.

관련 문제