2016-09-26 64 views
0

以前在java eclipse luna中运行的线程相同,但出现中断我将其更改为Java EE IDE,之前在luna中运行的线程现在不在Java EE IDE中运行,Java中的线程无法正常工作

public void clockTime(){ 
     Thread clock=new Thread(){ 
      public void run(){ 
       try { 
        for(;;){ 
         Calendar cald=new GregorianCalendar(); 
         day=cald.get(Calendar.DAY_OF_MONTH); 
         month=cald.get(Calendar.MONTH); 
         year=cald.get(Calendar.YEAR); 


         seconds=cald.get(Calendar.SECOND); 
         minutes=cald.get(Calendar.MINUTE); 
         hours=cald.get(Calendar.HOUR); 
         lblClock.setText("<html>"+hours+":"+minutes+":"+seconds+"<br>"+day+"/"+month+"/"+year+"</html>"); 
        sleep(1000); 
        } 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }; 
     clock.start(); 

     } 

请问任何人可以帮我? 调用该方法构造函数我已经在这里没有看到,但如果我删除线程该方法执行,因为它显示所需的时间和日期,但由于缺少循环和永久循环而不会改变。

+0

你的问题是不明确的,你应该修改它来改善它的风格,缓解其理解。 –

回答

3

如果这是一个Swing应用程序,然后:

  • 确保启动Swing事件线程的应用程序,通过调用SwingUtilities.invokeLater(Runnable);您的GUI在该Runnable
  • 你让启动在上面的代码中Swing事件线程(EDT)的一个关键Swing呼叫关闭,即呼叫lblClock.setText(...)。这也应该只在Swing事件线程上调用,就像上面的点一样。
  • 或者您可以使用SwingWorker,然后在发布/过程方法对中进行setText调用。
  • 或者(这是我会做的),查找上面的所有代码并使用Swing Timer。这很简单,你不必担心开/关Swing事件,因为所有的调用都将在事件线程中进行。

如果你去Swing Timer路由,你会在它的构造函数中构造一个int,等于所需的延迟,这里是1000 msecs。定时器的ActionListener被重复调用,并且你会得到你的时间值,然后用它来创建一个你传递给你的JLabel的String。

例如,一些大致是:

int timerDelay = 1000; 
Timer timer = new Timer(timerDelay, new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     // calculations to get time Strings 
     String text = ..... // use calculations above 
     lblClock.setText(text); 
    } 
}); 
timer.start(); 

注意代码没有经过测试