Stopwatch does not work in java

I am new to java. Now I am facing a problem. My goal is to put time in a text box. I need to press the start button, after which time will begin. But after I compile this code. He got an error. I am not going to do this. Can anybody help me? Thanks everyone!

Mistakes

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 

the 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); } } 
+4
source share
2 answers

There are some problems in the code. I would advise you to do this (as a quick fix):

 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 to:

  • right scope buttonPlay
  • correctly init javax.swing.Timer with its own listener (not a button listener)
  • always use SwingUtilities - when you need to update or create Swing components and you use code not in Swing EDT

"Decorative" problems: * you must also declare static constants as uppercase

+3
source

The scope of buttonPlay limited by the length of the PlayScene constructor and is PlayScene not available in other methods. To solve this problem, make it an attribute of the class.

+5
source

Source: https://habr.com/ru/post/1413134/


All Articles