[英]Java: setText() and threads
我是Java的初學者,但不幸的是我被卡在這個問題上。 在代碼中:
NewJFrame.java:
public class NewJFrame extends JFrame { public void showText() { SwingUtilities.invokeLater(new Runnable() { public void run() { jLabel1.setText("in show()"); //it does not work System.out.println("in show()"); //it works } }); } public NewJFrame() { initComponents(); jLabel1.setText("start"); //it works } public static void main(String args[]) { Timer timer = new Timer(); timer.schedule(new NewClass(), 1000, 2000); SwingUtilities.invokeLater(new Runnable() { public void run() { new NewJFrame().setVisible(true); } }); } private javax.swing.JLabel jLabel1; }
NewClass.java:
package newpackage;
import java.util.TimerTask;
class NewClass extends TimerTask {
public void run() {
System.out.println("in NewClass.run()"); //it works
new NewJFrame().showText();
}
}
我從計時器線程調用setText不會設置jLabel1的事實存在問題。 我嘗試使用invokeLater()解決問題,但仍然無法正常工作。 謝謝你的幫助。
您將在NewClass
中創建一個NewJFrame
的新實例,該實例永遠不會顯示:
new NewJFrame().showText();
您需要將可見實例傳遞給NewClass
以便對其進行更新。
但是,最好使用javax.swing.Timer
而不是java.util.Timer
與Swing組件進行交互。 從如何使用Swing計時器 :
通常,對於與GUI相關的任務,我們建議使用Swing計時器而不是通用計時器,因為Swing計時器都共享相同的,預先存在的計時器線程,並且與GUI相關的任務會在事件分發線程上自動執行。
另請參見: Swing中的並發
JLabel
永遠不會添加到任何容器中。 為什么會出現?
作為一般建議,請勿擴展框架,只需保留引用即可,如@Reimeus所述,請使用Swing Timer
。
設置文本后,嘗試添加repaint()
。
更改屏幕上的外觀后,必須始終重新繪制框架。
jLabel1.setText("in show()"); //it does not work
repaint(); //now it works
System.out.println("in show()"); //it works
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.