0

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;
        }

    }






}

Working code

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));

            }

    }

}
4

1 に答える 1

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が存在すると終了します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(つまり、getElapsedTime())

于 2012-12-15T00:23:27.820 に答える