Java 时钟在 Swing 中不计算在内 [英] Java clock isn't counting in Swing

查看:22
本文介绍了Java 时钟在 Swing 中不计算在内的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 Swing 制作秒表,但它不起作用.这是我的代码.Jlabel 时钟始终显示 -1,只有在它停止时才会发生这种情况.我是否正确使用了调用程序?

I am trying to make a stopwatch using swing, but it is not working. Here is my code. The Jlabel clock is always displaying -1, which should only happen if it is stopped. Am I using the invokelater properly?

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 类运行一次然后终止...

Your StopWatch class run once and then terminates...

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 方法.

A thread will terminate when it exists it's run method, in this case, your StopWatch's run method.

你需要做的是保持一个循环,直到 isRunning 变成 false

What you need to do to is maintain a loop until the isRunning becomes 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 会简单得多...

It would much simpler to use a javax.swing.Timer though...

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中去除功能(即getElapsedTime())

You can then strip out the functionality from you StopWatch (ie the getElapsedTime())

这篇关于Java 时钟在 Swing 中不计算在内的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆