2017-10-12 235 views
2

我知道很多人之前都问过这个问题,但我找不到任何解决我的问题的答案。我的代码是这样的:JLabel的值没有使用Java中的setText()更新

public void mouseClicked(MouseEvent arg0) { 
    TEXT.setText("ON"); 
    myfunction(); //runs for a very long time 
} 

JLabel的原文是"OFF"。现在我想点击鼠标时,但文字不设置当文本更改为"ON",直到myfunction()完成(这可能需要几分钟)。

我已经尝试了无效函数,使设置文本的单独函数,但没有任何工作。

请帮我解决这个问题!

+1

如果可能的话,你必须在单独的线程中运行myfunction() 。 myfunction()做什么? –

+0

它通过以太网获取数据并将其添加到数据库。我想避免线程... – KulaDamian

+0

有没有办法绕过线程。用swing编写好的代码总是会以某种形式使用线程。阅读我的答案,我详细解释它。 –

回答

2

问题是mouseClicked(...)UI Thread上执行。这是Thread,负责处理各种用户操作(如鼠标单击)及零部件的图纸(如更新屏幕上的标签的文本)。如果您在UI线程上执行长时间运行的方法调用,它将被阻止,并且在执行完成之前无法绘制任何内容。您必须使用multi threading来解决此问题。

下可能不是最完美的解决方案,但如果你是新的多线程它会完成这项工作:

public void mouseClicked(MouseEvent arg0) { 
    TEXT.setText("ON"); 
    (new Thread() { 
     public void run() { 
      myfunction(); 
     } 
    }).start(); 
} 

这将产生一个新的Thread来处理你的方法,这将让UI Thread继续做它的事情。考虑取消激活刚刚被点击的按钮,这样用户就不能在正在执行的时候开始执行(这通常是你想要的)。