简体   繁体   中英

Refresh jTextField following a timer

I'm working on an assignment for Java subject. I'm using NetBean IDE. My assignment requests me to make a word game. The game I'm designing involves a timer with delay of 1000 ms. The timer decrements a variable from 30 to 0. The timer itself is working. It is placed in the main function of GUI class. The problem I'm facing that I don't know how I'm supposed to update a jTextfield with everytime the variable is decremented.

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);


        }
    });
}

I'm not sure how to implement this properly

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

Not sure what you're doing wrong (that's why you should always provide a short example that we can copy-paste-compile-run that demonstrates the problem . When I make the code runnable, it works fine. That's why we need to be able to run your code to see where you're going wrong.

Here's the runnable version:

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);
            }
        });
    }
}

Here is the code refactored a bit with some better practices

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();
            }
        });
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM