Java线程 - 制作一个时钟和自己的时钟

时间:2015-11-10 18:17:13

标签: java multithreading user-interface

所以我开始对Threads以及它是如何工作感兴趣的,有点惊人它是如何工作的但是我今天刚刚了解它并尝试使程序工作。所以我试着制作一个时钟,让我在Jlabel中提供现在的时钟,以及我自己输入时间的Textfield。所以我想要的是它应该首先向我展示时间,当按下“设定时间”按钮时,它应该改变我进入的时间并从那里作为时钟。 My GUI

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

但是我认为这有点简单但很有趣,

编辑:我还发现在输入自己的“时钟”时我会有一个问题。我的代码:

 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());如果我以后换到自己的时钟,如果我是对的,可能不会算作时钟吗?在那种情况下,我该如何解决?

我希望我在帖子中有我所有的问题,我希望这里的任何人都愿意帮助我以及:)

编辑:

为了便于查看:enter image description here

编辑第3部分:0 enter image description here

3 个答案:

答案 0 :(得分:1)

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

//define a variable that controls the thread 1
static boolean clockSet = false;

现在写入线程1,例如它仅在clockSet为false时运行,即时钟未通过单击设置。

  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对象,设置用户定义的值,并在每次睡眠后增加时间。

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 :(得分:0)

当然,你看到了代码

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循环中每次都是第二次。所以时钟正在重置。

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

此外代码

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秒后。小时,分钟和第二个根据您从日历中获得的时间设置为值。

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

答案 2 :(得分:0)

在我看来,你根本不需要第二个线程。在这种情况下我要做的是创建三个Int字段,小时,分钟和秒偏移,按下按钮时可以更改,例如hourOffset = Calendar.HOUR_OF_DAY - Integer.parseInt(tfhour.getText())%24;(小时示例) )。你只需要在thread1中添加偏移量,因为从0开始作为偏移量,它始终有效。