如何使JLabel的setText成为一种安全的方法

时间:2014-12-23 14:40:31

标签: java multithreading swing

在挥杆中我制作了一个JLabel(用于天文台)。我正在使用一个循环并每秒睡眠的线程,所以每秒我写秒。

代码:

new thread(){
   public void run(){
   int i=0;
   while(true){ 
    try{
      sleep(1000);
       }catch(Exception e){}
       i++;
       jlabel1.settext(i);
    }
   }
}.start();

然后我使用另一个线程作为移动面板jpanel1

 new thread(){
   public void run(){
   while(true){ 
    try{
      sleep(100);
       }catch(Exception e){}
       j+=15;
       j=j%400;
       jpanel1.setLocation(j,50);
    }
   }
}.start();

如何修复此代码,因为当标签的setText()每秒完成时,面板会很奇怪(他从原点开始然后返回当前点) 我所有的研究都表明,在绘制组件时,Java的摇摆和awt并不是一种安全的方法。

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

  

我的所有研究都表明,当涉及到绘画作品时,java swing和awt不是一种安全的方法

这些都是正确的,必须在Event Dispatch Thread (EDT)中创建和更新Swing组件。有关详细信息,请参阅Concurrency in Swing教程。

这里发生的事情是Swing组件(标签和面板)正在外面更新EDT。要解决这个问题,并且根据您的要求制作计时器,最有用的工具是Swing Timer(链接到教程),它将在给定的时间段内执行重复任务,并且可以安全地在其中执行Swing组件更新。 actionPerformed()实施,因为那些在EDT中运行。

例如:

Timer timer = new Timer(1000, new ActionListener() {

     int i = 0;

    @Override
    public void actionPerformed(ActionEvent e) {
        i++;
        label.setText(String.valueOf(i));
    }
};

timer.setRepeats(true); // it will be repeated every 1 sec.
timer.start();