Java时钟在Swing中不算数

我正在尝试使用swing制作秒表,但它无法正常工作。 这是我的代码。 Jlabel时钟始终显示-1,只有在它停止时才会发生。 我正确使用了invokelater吗?

import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class sidePanel extends JApplet implements ActionListener{ JPanel pane; JLabel clock; JButton toggle; Timer timer; StopWatch stopWatch; public void init() { pane = new JPanel(); pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS)); clock = new JLabel("00:00"); toggle = new JButton("Start/Stop"); toggle.addActionListener(this); pane.add(clock); pane.add(toggle); timer = new Timer(500, this); timer.setRepeats(true); stopWatch = new StopWatch(); add(pane); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource() == toggle) { if(timer.isRunning()) { stopWatch.endTime = System.currentTimeMillis(); timer.stop(); } else { stopWatch.startTime = System.currentTimeMillis(); timer.start(); } } if(e.getSource() == timer) { long time = stopWatch.getElapsedTime(); sidePanel.this.clock.setText(String.valueOf(time)); } } private class StopWatch{ private long startTime =0; private long endTime =0; public boolean isRunning = false; public void start(){ startTime = System.currentTimeMillis(); isRunning = true; } public void end(){ endTime = System.currentTimeMillis(); isRunning = false; } public long getElapsedTime() { long currentTime = System.currentTimeMillis(); if(isRunning) return (currentTime - startTime)/1000; else return -1; } } } 

工作代码

 import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class sidePanel extends JApplet implements ActionListener{ JPanel pane; JLabel clock; JButton toggle; Timer timer; //StopWatch stopWatch; boolean pressed = false; long startTime =0; long endTime =0; public void init() { pane = new JPanel(); pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS)); clock = new JLabel("00:00"); toggle = new JButton("Start/Stop"); toggle.addActionListener(this); pane.add(clock); pane.add(toggle); timer = new Timer(500, this); timer.setRepeats(true); //stopWatch = new StopWatch(); add(pane); } long cur; long end; @Override public void actionPerformed(ActionEvent e) { if(e.getSource() == toggle) { if(!pressed) { timer.start(); startTime = System.currentTimeMillis(); pressed = true; } else { timer.stop(); pressed = false; } } if(timer.isRunning()) { endTime = System.currentTimeMillis(); clock.setText(String.valueOf((endTime-startTime)/1000)); } } } 

您的StopWatch类运行一次然后终止…

 public void run() { // Start here SwingUtilities.invokeLater(new Runnable() { @Override public void run() { long time = getElapsedTime(); sidePanel.this.clock.setText(String.valueOf(time)); } }); // End here... } 

线程将在它存在的run方法时终止,在本例中是StopWatchrun方法。

您需要做的是保持循环,直到isRunning变为false

 public void run() { while (isRunning) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { long time = getElapsedTime(); sidePanel.this.clock.setText(String.valueOf(time)); } }); // Because we really don't want to bombboard the Event dispatching thread // With lots of updates, which probably won't get rendered any way, // We put in a small delay... // This day represents "about" a second accuracy... try { Thread.sleep(500); } catch (Exception exp) { } } } 

使用javax.swing.Timer会更简单…

 private Timer timer; public void init() { pane = new JPanel(); pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS)); clock = new JLabel("00:00"); toggle = new JButton("Start/Stop"); toggle.addActionListener(this); pane.add(clock); pane.add(toggle); timer = new Timer(500, new ActionListener() { public void actionPerformed(ActionEvent evt) { long time = getElapsedTime(); sidePanel.this.clock.setText(String.valueOf(time)); } }); timer.setRepeats(true); add(pane); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource() == toggle) { if(timer.isRunning()) { endTime = System.currentTimeMillis(); timer.stop(); } else { startTime = System.currentTimeMillis(); timer.start(); } } } 

然后,您可以从StopWatch删除function(即getElapsedTime()