stopwatch not work in java

compiler-errors, java, jbutton, swing, timer

Solution

There are some problems in your code. I would advise you do like that (as fast correction):

public class PlayScene extends JFrame {

//declaration for time 
private static final String Play = "Play";
private static final String Pause = "Pause";
private Timer timer;
private long initTime = System.currentTimeMillis();
private long startTime;
private long pauseTime;
private boolean isRunning;

public void start() {
    if (!isRunning) {
        startTime = System.currentTimeMillis();
    } else {
        startTime = System.currentTimeMillis() - (pauseTime - startTime);
    }

    isRunning = true;
    timer.start();
}

public void pause() {
    pauseTime = System.currentTimeMillis();
    timer.stop();
}

private String getCurrentTime(long time) {
    return myFormat(time);
}

private String myFormat(final long time) {
    final long hr = TimeUnit.MILLISECONDS.toHours(time);
    final long min = TimeUnit.MILLISECONDS.toMinutes(time - TimeUnit.HOURS.toMillis(hr));
    final long sec = TimeUnit.MILLISECONDS.toSeconds(time - TimeUnit.HOURS.toMillis(hr)
            - TimeUnit.MINUTES.toMillis(min));
    final long ms = TimeUnit.MILLISECONDS.toMillis(time - TimeUnit.HOURS.toMillis(hr)
            - TimeUnit.MINUTES.toMillis(min) - TimeUnit.SECONDS.toMillis(sec));
    return String.format("%02d:%02d:%02d.%01d", hr, min, sec, ms / 100);
}

public PlayScene() {
    super("Memory Game");
    setBounds(300, 40, 800, 600);

    final JButton buttonPlay = new JButton(Play);

    JLabel labelTimer = new JLabel("Timer");

    final JTextField text2 = new JTextField(15);
    text2.setEnabled(false);
    text2.setText(getCurrentTime(System.currentTimeMillis() - initTime));

    JLabel up = new JLabel();

    JLabel left = new JLabel();
    JLabel space1 = new JLabel("                           ");

    JLabel right = new JLabel();
    JLabel space2 = new JLabel("                            ");

    final JPanel upPanel = new JPanel(new FlowLayout());
    upPanel.add(labelTimer);
    upPanel.add(text2);

    JPanel bottomPanel = new JPanel(new FlowLayout());
    bottomPanel.add(buttonPlay);

    JPanel leftPanel = new JPanel(new FlowLayout());
    leftPanel.add(space1);

    JPanel rightPanel = new JPanel(new FlowLayout());
    rightPanel.add(space2);

    add(upPanel, BorderLayout.NORTH);
    add(bottomPanel, BorderLayout.SOUTH);
    add(leftPanel, BorderLayout.WEST);
    add(rightPanel, BorderLayout.EAST);

    setVisible(true);

    buttonPlay.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String cmd = e.getActionCommand();
            if (Pause.equals(cmd)) {
                pause();
                buttonPlay.setText(Play);

            } else {
                buttonPlay.setText(Pause);
                start();
            }
        }
    });

    timer = new Timer(100, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    text2.setText(getCurrentTime(System.currentTimeMillis() - initTime));
                }
            });
        }
    });
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            JFrame frame = new PlayScene();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    });
}

}

Basically you need:

- correct scope of buttonPlay

- correctly init `javax.swing.Timer` with its own listener (not your button listener)

- use SwingUtilities always - when you need to update or create Swing components and you running code not in Swing EDT

"Decorative" issues: * you should also declare static constants as upper-case

Problem

I am newbie in java. I am facing problem now. My purpose is to put the time in textfield. I need press "Start" button and then the time will start go. But after i compile this code. It got error. I have no idea to do it. Can anybody help me? Thanks everyone!! Errors ``` I:\PlayScene.java:108: cannot find symbol symbol: variable buttonPlay buttonPlay.setText(Play); ^ I:\PlayScene.java:111: cannot find symbol symbol: variable buttonPlay buttonPlay.setText(Pause); ^ I:\PlayScene.java:103: cannot find symbol symbol : variable buttonPlay location: class PlayScene buttonPlay.addActionListener(new ActionListener() { ^ 3 errors ``` Code ``` import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Timer.*; import java.util.*; import javax.swing.Timer; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.concurrent.TimeUnit; public class PlayScene extends JFrame implements ActionListener{ //declaration for time private static final String Play = "Play"; private static final String Pause = "Pause"; private Timer timer = new javax.swing.Timer(100, this); private long initTime = System.currentTimeMillis(); private long startTime; private long pauseTime; private boolean isRunning; public void start() { if (isRunning == false) { startTime = System.currentTimeMillis(); } else { startTime = System.currentTimeMillis() - (pauseTime - startTime); } isRunning = true; timer.start(); } public void pause() { pauseTime = System.currentTimeMillis(); timer.stop(); } private String getCurrentTime(long time) { return myFormat(time); } private String myFormat(final long time) { final long hr = TimeUnit.MILLISECONDS.toHours(time); final long min = TimeUnit.MILLISECONDS.toMinutes(time - TimeUnit.HOURS.toMillis(hr)); final long sec = TimeUnit.MILLISECONDS.toSeconds(time - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min)); final long ms = TimeUnit.MILLISECONDS.toMillis(time - TimeUnit.HOURS.toMillis(hr) - TimeUnit.MINUTES.toMillis(min) - TimeUnit.SECONDS.toMillis(sec)); return String.format("%02d:%02d:%02d.%01d", hr, min, sec, ms/100); } public PlayScene(){ super("Memory Game"); setBounds(300,40,800,600); final JButton buttonPlay = new JButton(Play); //create label JLabel labelTimer = new JLabel("Timer"); JTextField text2 = new JTextField(15); text2.setEnabled(false); text2.setText(getCurrentTime(System.currentTimeMillis() - initTime)); //Labels for upper JLabel up = new JLabel(); //JLabel space = new JLabel("\n"); //Label for left JLabel left = new JLabel(); JLabel space1 = new JLabel(" "); //Label for right JLabel right = new JLabel(); JLabel space2 = new JLabel(" "); //create up panel final JPanel upPanel = new JPanel(new FlowLayout()); upPanel.add(labelTimer); upPanel.add(text2); JPanel bottomPanel = new JPanel(new FlowLayout()); bottomPanel.add(buttonPlay); JPanel leftPanel = new JPanel(new FlowLayout()); leftPanel.add(space1); JPanel rightPanel = new JPanel(new FlowLayout()); rightPanel.add(space2); add(upPanel,BorderLayout.NORTH); add(bottomPanel,BorderLayout.SOUTH); add(leftPanel, BorderLayout.WEST); add(rightPanel,BorderLayout.EAST); setVisible(true); } public void actionPerformed(ActionEvent e) { buttonPlay.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if (Pause.equals(cmd)) { pause(); buttonPlay.setText(Play); } else { buttonPlay.setText(Pause); start(); } } }); } public static void main(String[] args) { JFrame frame = new PlayScene(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } ```

Original source