Счетчик, чтобы закрыть JFrame, вызвать диалог подтверждения - PullRequest
2 голосов
/ 26 сентября 2011

Этот пост относится к моему последнему, касающемуся таймера.Я решил, что для получения немедленных результатов проще всего было написать поток Counter, который ведет обратный отсчет с определенного времени (в данном случае 5 секунд), и если счетчик достигает 0, JFrame закрывается и дает пользователю знать, что время истекло,

Однако у меня возникли проблемы.Кажется, я не могу закрыть JFrame, когда счетчик достигнет 0. Я не уверен, что мне не хватает чего-то глупого или я неправильно понимаю, как работают потоки и как работают JFrames.Вот код, дайте мне знать, что вы думаете.

Кстати, я понимаю, что, вероятно, будет наиболее эффективно использовать качели. Время, но я просто не совсем понимаю их природу.еще.У меня есть временные ограничения (я не студент или что-то в этом роде, мне просто нравится оставаться мотивированным), и поэтому я пока что просто «фальсифицирую» эту вещь.

В любом случае, нак коду!

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;

public class RacerDoom extends JFrame {

boolean timesUp=false;

public RacerDoom() {
//create JFrame
super("Racer Doom Squared");
setSize(WIDTH,HEIGHT);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
if(timesUp==true) {
dispose();
JOptionPane.showConfirmDialog(null, "Time's Up! Click Okay to try again!");
}

Counter c1 = new Counter();
c1.start();

//Counter
private class Counter extends Thread {
public Counter() {}
public void run() {
for(int i=5;i>=0;i--) {
if(i==0) {
timesUp=true;
}
System.out.println(i);
try{
Thread.sleep(1000);
}
catch(InterruptedException e){}
}
}
}
...

РЕДАКТИРОВАТЬ: У меня есть таймер реализован и работает.Он делает именно то, что мне нужно, но я не могу заставить работать команду timer.stop();.Я получаю сообщение об ошибке "Таймер локальной переменной не мог быть инициализирован.

Как я уже сказал, таймер работает, он просто никогда не перестает работать, пока программа не завершится. Вот код конструктора для JFrame, гдетаймер находится.

int counter = 0;

public RacerDoom() {
    //create JFrame
    super("Racer Doom Squared");
    setSize(WIDTH,HEIGHT);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    final Timer timer=new Timer(1000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(counter>=10) {
                timer.stop();  //the error occurs here
                dispose();
                JOptionPane.showConfirmDialog(null, "Time's Up!");
            }
            else{
               counter++;
               }
            System.out.println(counter);
        }
    });

    //inner thread
    Move1 m1 = new Move1();
    m1.start();

    timer.start();
    }

1 Ответ

4 голосов
/ 26 сентября 2011

Это легко сделать с помощью таймера свинга. См. Пример кода:

final java.swing.Timer timer=new Timer(1000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(counter>5) {
                timer.stop();
                <dispose the fram here>
            }else{
               counter++;
               }
        }
    });
    timer.start();

Я поместил этот код в конструктор моего JFrame, который будет запускаться в потоке отправки событий. Если вы не хотите вешать графический интерфейс, убедитесь, что вы запускаете этот таймер в другом потоке, а когда вы освобождаете JFrame, оберните вызов с помощью SwingUtilities.invokeLater () - это гарантирует, что вызов будет поставлен в очередь в потоке отправки событий.

Я думаю, что ваш код не работает по той же причине, что вы пытаетесь что-то, что не помещается в очередь в потоке отправки событий. Вот статья, которая поможет вам

http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

...