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
方法时终止,在本例中是StopWatch
的run
方法。
您需要做的是保持循环,直到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()
)
- 摆动窗口被冻结,不显示内容
- Servlet 3.0异步
- 如何在java桌面应用程序中使用菜单(网站样式导航链接)
- 如何从java中获取时区偏移量的时区?
- 用户拒绝Java JDBC访问
- JVM在libzip.so崩溃
- java BufferedReader特定长度返回NUL字符
- 带有Ant的Java NoClassDefFoundError
- java.lang.NoSuchMethodError:org.slf4j.spi.LocationAwareLogger.log(Lorg / slf4j / Marker; Ljava / lang / String; ILjava / lang / String; [Ljava / lang / Obje