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