Java时钟在Swing中不算数

时间:2012-12-15 00:12:05

标签: java swing timer stopwatch

我正在尝试使用挥杆制作秒表,但它无效。这是我的代码。 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));

            }

    }

}

1 个答案:

答案 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