首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java线程-创建一个时钟和自己的时钟

问Java线程-创建一个时钟和自己的时钟
EN

Stack Overflow用户
提问于 2015-11-10 18:17:12
回答 3查看 5.9K关注 0票数 2

所以我开始对线程和它的工作方式产生真正的兴趣,Kinda令人惊叹它是如何工作的,但我今天才了解到它,并试图使一个程序工作起来。所以我试着做一个时钟,给我一个Jlabel,一个现在的时钟,和一个Textfield,在那里我自己输入时间。所以我想做的是,它应该从显示时间开始,当按下“设定时间”按钮时,它应该改变我输入的时间,然后作为一个时钟从那里走。

​

所以我现在的问题是,每当我按下设定的时间,它就会改变一秒钟,然后再回到当前的时钟。我也不知道如何在按下设定时间(即启动第二个线程)时停止第一个线程。

不过,我觉得这很简单,但很有趣,

编辑:我还发现,当我输入自己的“时钟”时,计数会有问题。我的代码:

代码语言:javascript
复制
 public Clock() {
            initialize();
            Thread1();

        }

    .......


JButton btnSetTime = new JButton("Set time");
            btnSetTime.setBounds(474, 262, 89, 23);
            frame.getContentPane().add(btnSetTime);
            btnSetTime.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    if(e.getSource() == btnSetTime) {
                        Thread2();

                    }

                }
            });
        }

        public void Thread2() {
            Thread t2 = new Thread() {
                public void run() {
                    try {
                        for(;;) {
                            int hour = Integer.parseInt(tfhour.getText());
                            int minute = Integer.parseInt(tfminute.getText());
                            int second = Integer.parseInt(tfsecond.getText());

                            lblKlockan.setText(hour + ":" + minute + ":" + second);
                            sleep(1000);
                        }
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } 
                }
            };t2.start();
        }

        public void Thread1() {
            Thread t1 = new Thread() {
                public void run() {
                    try {
                        for(;;) {
                            Calendar cal = Calendar.getInstance();
                            int hour = cal.get(Calendar.HOUR_OF_DAY);
                            int minute = cal.get(Calendar.MINUTE);
                            int second = cal.get(Calendar.SECOND);

                            lblKlockan.setText(hour + ":" + minute + ":" + second);
                            sleep(1000);
                        }
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } 
                }
            };t1.start();
        }
    }

因此,正如我所看到的,如果稍后更改为自己的时钟,则int hour = Integer.parseInt(tfhour.getText());可能不会算作时钟,如果我是正确的话?那样的话,我该怎么解决呢?

我希望我的所有问题都在这里,我希望在座的任何人也愿意帮助我:)

编辑:

使人更容易看到:

​

编辑第3部分:0

​

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-10 19:07:57

当线程2启动时,您必须定义一个全局变量来停止线程1。以下是一个例子,

代码语言:javascript
复制
//define a variable that controls the thread 1
static boolean clockSet = false;

现在编写线程1,因为它只在clockSet为false时运行,即不通过单击来设置时钟。

代码语言:javascript
复制
  Thread t1 = new Thread(){
        public void run(){
           while(!clockSet){
            Calendar cal = Calendar.getInstance();
                int hour = cal.get(Calendar.HOUR_OF_DAY);
                int minute = cal.get(Calendar.MINUTE);
                int second = cal.get(Calendar.SECOND);                   
               lblKlockan.setText(hour + ":" + minute + ":" + second);
               try {
              sleep(1000);
            } catch (InterruptedException e) {
                    e.printStackTrace();
            }
        }
    }
   };

在您的线程2中,将clockSet设置为true,这样线程1将停止。我看到您只是显示输入的值,而不是在Calendar对象上设置这些值。因此,在线程2中创建Calendar对象,设置用户定义的值,并在每秒钟睡眠后增加时间。

代码语言:javascript
复制
Thread t2 = new Thread(){
    public void run(){
        clockSet = true;
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(tfhour.getText()));
        cal.set(Calendar.MINUTE, Integer.parseInt(tfminute.getText()));
        cal.set(Calendar.SECOND, Integer.parseInt(tfsecond.getText()));
        while(true){                    
                int hour = cal.get(Calendar.HOUR_OF_DAY);
                int minute = cal.get(Calendar.MINUTE);
                int second = cal.get(Calendar.SECOND);                   
               lblKlockan.setText(hour + ":" + minute + ":" + second);
               try {
            sleep(1000);
            cal.add(Calendar.SECOND, 1);
        } catch (InterruptedException e) {
            e.printStackTrace();}
      }
     }
   };

玩得开心..!

票数 1
EN

Stack Overflow用户

发布于 2015-11-10 18:38:01

当然,你看到密码了

代码语言:javascript
复制
try {
                        for(;;) {
                            int hour = Integer.parseInt(tfhour.getText());//this one
                            int minute = Integer.parseInt(tfminute.getText());//and this one
                            int second = Integer.parseInt(tfsecond.getText());//and this too

                            lblKlockan.setText(hour + ":" + minute + ":" + second);
                            sleep(1000);
                        }

在for循环中,您每次都设置小时、分钟和秒。所以钟在重新分配。

使它们只初始化一次,即将它们从循环中取出。

进一步这段代码

代码语言:javascript
复制
for(;;) {
                            Calendar cal = Calendar.getInstance();
                            int hour = cal.get(Calendar.HOUR_OF_DAY);
                            int minute = cal.get(Calendar.MINUTE);
                            int second = cal.get(Calendar.SECOND);

                            lblKlockan.setText(hour + ":" + minute + ":" + second);
                            sleep(1000);
                        }

使你的计时器成为时钟而不是计时器,因为1秒后。“小时”、“分钟”和“秒”根据从日历获得的时间设置为值。

因此,您的代码将作为显示当前时间的时钟工作。

票数 0
EN

Stack Overflow用户

发布于 2015-11-10 18:59:35

在我看来,你根本不需要第二条线。在本例中,我要做的是创建三个Int字段,小时、分钟和秒偏移量,当按钮按到hourOffset = Calendar.HOUR_OF_DAY - Integer.parseInt(tfhour.getText())%24; (例如小时)时,您可以更改这些字段。您只需要将偏移量添加到thread1中的时间中,因为从0作为偏移量开始时,这一切都是有效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33636812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档