数字时钟在运行时会很奇怪。 (JAVA)

时间:2015-11-13 12:39:30

标签: java multithreading calendar jframe jpanel

所以我制作了一个程序,我在运行程序时出现了一个时钟。所以。当我按下“开始”按钮时,时钟应该在一个边界内随机出现并作为一个时钟(我的意思是数字,15:18:19,15:18:20)。但是每当我按下程序时,我的问题就出现了。时钟停留在同一个位置,当将睡眠时间改为等时500.然后它开始移动,但是时间semms更快(因为它应该睡1000)。但是我没有在代码中看到它应该去的问题。但是也许你们中的一些人可以帮助我。

public void startClock() {
  Thread t2 = new Thread() {
   public void run() {
    if (clocking) {
     Random rand = new Random();

     while(clocking){
      Calendar cal = Calendar.getInstance();
      int hour = cal.get(Calendar.HOUR_OF_DAY);
      int minute = cal.get(Calendar.MINUTE);
      int second = cal.get(Calendar.SECOND);
      movingClock.setText(hour + ":" + minute + ":" + second);
      int x = rand.nextInt(100) + 1;
      int y = rand.nextInt(100) + 1;
      movingClock.setBounds(x, y, 150, 150);


      try {
       sleep(1000);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
     }
    } 
   }

  };

  t2.start();
 }

其中clocking = true。因为每当我按下按钮。我将时钟转为true,然后运行startClock()。

但正如我之前所说。如果我将睡眠时间改为500以下,数字时钟只会随机出现。如果睡眠时间如何(1000)我怎么能让它工作?

编辑新的一个:

public void startMoving() {
    Thread t1 = new Thread() {
        public void run() {
            if (moving) {
                Random random = new Random();
                while (moving) {
                    int x = random.nextInt(100) + 1;
                    int y = random.nextInt(100) + 1;
                    movingDisplay.setBounds(x, y, 150, 150);

                    try {
                        sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            } 
        }

    };

    t1.start();
}




public void startClock() {
    Thread t2 = new Thread() {
        public void run() {
            if (clocking) {
                Random rand = new Random();

                while(clocking){

                    Calendar cal = Calendar.getInstance();
                    int hour = cal.get(Calendar.HOUR_OF_DAY);
                    int minute = cal.get(Calendar.MINUTE);
                    int second = cal.get(Calendar.SECOND);
                    movingClock.setText(hour + ":" + minute + ":" + second);
                    int x = rand.nextInt(100) + 1;
                    int y = rand.nextInt(100) + 1;
                    movingClock.setBounds(x, y, 150, 150);

                    java.awt.EventQueue.invokeLater(new Runnable() {
                        public void run() {
                            movingClock.setText(hour + ":" + minute + ":" + second);
                            movingClock.setBounds(x, y, 150, 150);
                            movingDisplay.setBounds(x, y, 150, 150);
                        }
                    } );


                    try {
                        sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            } 
        }

    };

    t2.start();
}

1 个答案:

答案 0 :(得分:0)

我猜你试图在像JPanel这样的Swing组件上移动你的时钟。您应该对Event Dispatch Thread

上的组件进行所有修改

您的代码应如下所示:

java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
        movingClock.setText(hour + ":" + minute + ":" + second);
        movingClock.setBounds(x, y, 150, 150);
    }
} );

看看: Java Event-Dispatching Thread explanation