Обновить jTextField после таймера

Я работаю над заданием для предмета Java. Я использую NetBean IDE. Мое задание просит меня сделать игру в слова. Игра, которую я разрабатываю, включает в себя таймер с задержкой 1000 мс. Таймер уменьшает значение переменной с 30 до 0. Сам таймер работает. Он помещается в основную функцию класса GUI. Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как я должен обновлять поле jText при каждом уменьшении переменной.

public static void main(String args[]) {

    Time counter=new Time();
ActionListener actListner = new ActionListener() {
            public void actionPerformed(ActionEvent event) {

            counter.decTime();
             jTime.setText("Time left: " + counter.getTime());


}



 };
          Timer timer = new Timer(1000, actListner);
            timer.start();
    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new StartGUI().setVisible(true);


        }
    });
}

Я не уверен, как правильно это реализовать

jTime.setText("Time left: " + counter.getTime());

1 ответ

Решение

Не уверен, что вы делаете неправильно (вот почему вы всегда должны предоставить короткий пример, который мы можем скопировать-вставить-компилировать-запустить, который демонстрирует проблему. Когда я делаю код работоспособным, он работает нормально. Вот почему мы должны быть возможность запустить свой код, чтобы увидеть, где вы идете не так.

Вот работающая версия:

import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.Timer;

public class StartGUI extends JFrame {

    static JTextField jTime = new JTextField(10);

    public StartGUI() {
        jTime.setEditable(false);
        add(jTime);
        setLayout(new GridBagLayout());
        setSize(200, 200);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    static class Time {
        int time = 1000;
        void decTime() {
            time--;
        }
        int getTime() {
            return time;
        }
    }

    public static void main(String args[]) {
        Time counter = new Time();
        ActionListener actListner = new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                counter.decTime();
                jTime.setText("Time left: " + counter.getTime());
            }
        };
        Timer timer = new Timer(1000, actListner);
        timer.start();
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new StartGUI().setVisible(true);
            }
        });
    }
}

Вот код немного переработан с некоторыми лучшими методами

import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.Timer;

public class StartGUI extends JFrame {

    private JTextField jTime = new JTextField(10);
    private Timer timer = createTimer(1000);

    public StartGUI() {
        jTime.setEditable(false);

        add(jTime);
        setLayout(new GridBagLayout());
        pack();
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private Timer createTimer(int delay) {
        Timer timer = new Timer(delay, new ActionListener(){
            Time counter = new Time(30);
            public void actionPerformed(ActionEvent e) {
                if (counter.getTime() == 0) {
                    ((Timer)e.getSource()).stop();
                    jTime.setText("Times up!");
                } else {
                    jTime.setText("Time left: " + counter.getTime());
                    counter.decTime();
                }
            }
        });
        timer.setInitialDelay(0);
        return timer;
    }

    private Timer getTimer() {
        return timer;
    }

    static class Time {
        int time = 1000;
        public Time(int time) {
            this.time = time;
        }
        void decTime() {
            time--;
        }
        int getTime() {
            return time;
        }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                StartGUI start = new StartGUI();
                start.setVisible(true);
                start.getTimer().start();
            }
        });
    }
}
Другие вопросы по тегам