计时器/秒表GUI

四分

我正在尝试制作一个简单的Java应用程序,该应用程序可以计时并具有停止和启动计时器的功能。但是,标签不会更新,并且当我按开始键时,它会冻结。

您能帮我找出问题所在吗?

package random;

import javax.swing.JFrame;

public class Timer {
boolean shouldCount=false;
int int_sec=0;
int int_min=0;
int int_mil=0;
public static void main(String[] args) {
    TimeFrame t = new TimeFrame();
    JFrame f = new JFrame("Timer");
    f.setSize(300,200);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setLocationRelativeTo(null);
    f.getContentPane().add(t);
    f.setVisible(true);
}

public void count(){
    TimeFrame t = new TimeFrame();
    if(shouldCount){
        long now = System.currentTimeMillis();
        while(true){
            if(System.currentTimeMillis()-now>=100){
                now=System.currentTimeMillis();
                String sec = Integer.toString(int_sec);
                String min = Integer.toString(int_min);
                String mil = Integer.toString(int_mil);
                t.update(sec,int_sec,min,mil,int_mil);
                int_mil++;
                if(int_mil>9){
                    int_mil=0;
                    int_sec++;
                    if(int_sec>=60){
                        int_sec=1;
                        int_min++;
                    }
                }
            }
        }
    }
}
}

这是TimeFrame.java

    package random;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;

    public class TimeFrame extends JPanel{
    JLabel time = new JLabel("Time goes here", JLabel.CENTER);
    Timer t = new Timer();
    JButton pause = new JButton ("Pause");
     JButton start = new JButton ("Start");
    public TimeFrame(){

         start.addActionListener(new starts());
         pause.addActionListener(new starts());
         add(time);
         add(start);
         add(pause);
    }
    public void update(String sec,int s, String min,String mil,int m){
        if (s<=10){
            sec="0"+sec;
        }
        System.out.println(min+":"+sec+","+mil);
        time.setText(min+":"+sec+","+mil);

    }
    public class starts implements ActionListener{
        public void actionPerformed(ActionEvent event){
            if(event.getSource() == start){
                t.shouldCount=true;
            }else{
                t.shouldCount=false;
            }
            t.count();
        }
    }
}
马克

问题是您的应用程序中只有一个线程。您应该至少有两个:一个用于更新文本的UI,另一个用于计算时间。

如果只有一个线程,它将挂在while(true)循环中,而Swing永远无法更新视图。

我使用两个线程重构了您的代码:

  1. 一次计数直到时间结束,然后更新字段以将时间保留在内存中

  2. 每隔100毫秒调用另一个使用java.util.Timer#scheduleAtFixedRate()方法的方法来更新视图。

Timer.java (避免像Java API中那样命名类)

    public class Timer {

        boolean shouldCount=false;
        int int_sec=0;
        int int_min=0;
        int int_mil=0;

        public Timer() {
        }

        public static void main(String[] args) {
            TimeFrame t = new TimeFrame();
            JFrame f = new JFrame("Timer");
            f.setSize(300,200);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setLocationRelativeTo(null);
            f.getContentPane().add(new TimeFrame());
            f.setVisible(true);
        }

        public void count(){
                Thread thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        long now = System.currentTimeMillis();
                        while(true){
                        if(shouldCount){
                            if(System.currentTimeMillis()-now>=100){
                                now=System.currentTimeMillis();
                                int_mil++;
                                if(int_mil>9){
                                     int_mil=0;
                                     int_sec++;
                                     if(int_sec>=60){
                                          int_sec=1;
                                          int_min++;
                                     }
                                }
                            }       
                        }
                    }               
                }
            });
            thread.start();
        }
    }
}

TimeFrame(我宁愿称呼它,TimePanel因为它扩展了JPanel

public class TimeFrame extends JPanel{
    JLabel time;
    Timer t ;
    JButton pause ;
    JButton start ;
    public TimeFrame(){

        t= new Timer(this);

        time = new JLabel("Time goes here", JLabel.CENTER);
        pause = new JButton ("Pause");
        start = new JButton ("Start");

        start.addActionListener(new starts());
        pause.addActionListener(new starts());
        add(time);
        add(start);
        add(pause);

        java.util.Timer updateTimer= new java.util.Timer();
        updateTimer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            t.update(int_sec,int_min,int_mil);
        }
        }, 0, 100);
    }    

    public void update(int s, int minute,int m){
        String sec = Integer.toString(s);
        String min = Integer.toString(minute);
        String mil = Integer.toString(m);
    if (s<=10){
            sec="0"+sec;
        }

        System.out.println(min+":"+sec+","+mil);
        time.setText(min+":"+sec+","+mil);
    }


   public class starts implements ActionListener{
    boolean firstTime=true;
    public void actionPerformed(ActionEvent event){
        if (firstTime){
            t.count();
            firstTime = false;
        }
        if(event.getSource() == start){
            t.shouldCount=true;
        }else{
            t.shouldCount=false;
        }
    }
}

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

秒表计时器递增(例如倒数计时器)

来自分类Dev

秒表(计时器)不起作用

来自分类Dev

带计时器的Java秒表

来自分类Dev

Ubuntu 14.04 Unity中的计时器/秒表?

来自分类Dev

单击按钮时如何添加秒表计时器?

来自分类Dev

带TimeSpan的计时器和自制计时器比秒表慢

来自分类Dev

不使用Tk python创建秒表(而不是倒数计时器或计时器)

来自分类Dev

使用秒表的计时器setInterval / clearInterval将计时器重置为0

来自分类Dev

创建一个计时器/秒表并在动画后开始

来自分类Dev

在Glass上运行计时器,秒表和指南针示例似乎不起作用

来自分类Dev

如何在不使用计时器的情况下以Windows窗体显示秒表

来自分类Dev

如何使用requestAnimationFrame暂停并重新启动秒表计时器?

来自分类Dev

如何在不使用计时器的情况下以Windows形式显示秒表

来自分类Dev

Thread.Sleep(x)是否会干扰计时器/秒表?

来自分类Dev

秒表-在单击启动计时器onclick处理程序之前,将经过时间保持为零

来自分类Dev

Android秒表/计时器应用程序-时间用尽时切换回应用程序

来自分类Dev

像旧的秒表计时器一样,在“曲面视图”的一角旋转位图(钟针)?

来自分类Dev

重置计时器?

来自分类Dev

后台计时器

来自分类Dev

大量的计时器

来自分类Dev

重启计时器

来自分类Dev

后台计时器

来自分类Dev

计时器关机

来自分类Dev

重置计时器

来自分类Dev

计时器 - javascript

来自分类Dev

如何设置计时器和清除计时器?

来自分类Dev

计时器正在创建多个计时器实例

来自分类Dev

计时器内部的调用方法计时器ElapsedEvent

来自分类Dev

在单个计时器中处理多计时器

Related 相关文章

热门标签

归档