2010-03-19 3 views
1

simples GUI 카운트 다운을 쓰려고합니다. 인터넷에서 코드를 찾았지만 이미 너무 멋져요. 나는 그것을 가능한 한 간단하게 유지하려고 노력하고있다. 그래서, 나는 단지 "당신은 10 초 남았습니다."라고 말하는 창을 갖고 싶습니다. 초 수가 10에서 0으로 매초 감소해야합니다. 코드를 썼습니다. 그리고 나는 내가 일하는 해결책에 가깝다고 생각한다. 그러나 나는 아직도 뭔가를 놓친다. 무엇이 잘못되었는지 찾아 내도록 도와 주실 수 있습니까? 여기 내 코드입니다 :simples GUI 카운트 다운이 어떻게 작동할까요?

import javax.swing.*; 

public class Countdown { 

    static JLabel label; 

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

    // Define a new thread in which the countdown is counting down. 
    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(i,label) { 

      public Runnable(int i, JLabel label) { 
       this.i = i; 
       this.label = label; 
      } 

      public void run() { 
       label.setText("You have " + i + " seconds."); 
      } 

     }); 
    } 

    // The main method (entry point). 
    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       showGUI(); 
       //counter.start(); 
      } 
     }); 
     //counter.start(); 
    } 

} 

는 그리고이 코드에 대한 몇 가지 구체적인 질문이 있습니다

  1. 내가 counter.start();을 두어야을? (내 코드에서 두 곳을 썼습니다. 어느 것이 맞습니까?)

  2. 왜 컴파일러가 Runnable의 생성자에 대해 불평합니까? 그것은 잘못된 메소드 선언이 있고 반환 된 유형을 지정해야한다고 말합니다.

ADDED는 : 내가 제안 된 수정했다. 그리고 나는 코드를 실행하고 얻을 :

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at Worker.run(Worker.java:12) 

을 Worker.java에서 내가 가지고있는 라인 12 : label.setText("You have " + i + " seconds.");.

+0

을 표시 얻을 : 나는 또한 Thread.wait에 의존하지 것이다()에 정확히 1000ms를 기다리십시오. 남은 시간을보고 동적으로 초를 생성하십시오. 루프를 시작할 때 시간을 저장하고 절전 간격이 만료되는 시간을 계속 쿼리하십시오. –

+0

JLabel label = 새 JLabel ("일부 텍스트"); 이것을 으로 변경하십시오. label = new JLabel ("Some Text"); 나중에 사용하기 전에 필드를 설정하지 않았습니다. –

+0

Chris Dennett, 귀하의 제안이 작동합니다. 이제는 작동하는 응용 프로그램이 있습니다. 고마워요! 그러나, 나는 마지막 문제를 얻지 못했습니다. "label"앞에 "JLabel"을 사용하면 "label"을 메서드의 지역 변수로 만듭니다. – Roman

답변

2

를 호출 실행 가능한 내부 counter.start() :

// The main method (entry point). 
public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      showGUI(); 
      counter.start(); 
     } 
    }); 
} 

당신은 정말 당신이 스레드 외부로 배치하면 다음 카운터는 GUI가 존재하기도 전에 시작하고 당신에 실패, 호출의 특정 순서를 원한다. 두 번째 질문에 대한

: 지금

import javax.swing.JLabel; 

public class Worker implements Runnable{ 
    private int i; 
    private JLabel label; 
    public Worker(int i, JLabel label) { 
     this.i = i; 
     this.label = label; 
    } 

    public void run() { 
     label.setText("You have " + i + " seconds."); 
    } 
} 

그리고 주 :

// The main method (entry point). 
public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      Countdown.showGUI(); 
      counter.start(); 
     } 
    }); 
} 

UPDATE : 여기

// A method which updates GUI (sets a new value of JLabel). 
private static void updateGUI(final int i, final JLabel label) { 
    SwingUtilities.invokeLater(new Worker(i, label)); 
} 

는 노동자입니다
또는 경우 여전히 익명의 p를 사용하고 싶다. 다음 attern :

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

public class Countdown { 

    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."); 
       } 
      } 
     ); 
    } 
} 
1

답안의 익명 예제는 완벽하게 작동합니다. 첫 번째 대답은, 카운터 작업,하지만 GUI에 관해서는

표시하고, 각 초에 아래 예외는 그냥 코멘트

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
     at com.aramco.ecc.licenseoptimizer.gui.Worker.run(Worker.java:23) 
     at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
관련 문제