簡體   English   中英

Java:setText()和線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM