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();
}
}
는 그리고이 코드에 대한 몇 가지 구체적인 질문이 있습니다
내가
counter.start();
을 두어야을? (내 코드에서 두 곳을 썼습니다. 어느 것이 맞습니까?)왜 컴파일러가 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.");
.
을 표시 얻을 : 나는 또한 Thread.wait에 의존하지 것이다()에 정확히 1000ms를 기다리십시오. 남은 시간을보고 동적으로 초를 생성하십시오. 루프를 시작할 때 시간을 저장하고 절전 간격이 만료되는 시간을 계속 쿼리하십시오. –
JLabel label = 새 JLabel ("일부 텍스트"); 이것을 으로 변경하십시오. label = new JLabel ("Some Text"); 나중에 사용하기 전에 필드를 설정하지 않았습니다. –
Chris Dennett, 귀하의 제안이 작동합니다. 이제는 작동하는 응용 프로그램이 있습니다. 고마워요! 그러나, 나는 마지막 문제를 얻지 못했습니다. "label"앞에 "JLabel"을 사용하면 "label"을 메서드의 지역 변수로 만듭니다. – Roman