我正在尝试使用挥杆制作秒表,但它无效。这是我的代码。 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));
}
}
}
答案 0 :(得分:4)
您的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
的{{1}}方法。
您需要做的是在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
)