Java JTextField无法更新

时间:2018-09-24 15:01:05

标签: java swing

运行以下代码时,我在TextField级别上遇到问题。在此过程中不会更新。 完成所有计算后,它将立即完全更新。

System.out.println("Start....!!");
MyJTextField.setText("Start....!!"); 

MyJTextField.setText("Result1 is calculated now….”); 
/* here : Connect a DataBase and Make Calculations of the Var : Result1 */
System.out.println(Result1); 

MyJTextField.setText("Result2 is calculated now….”); 
/* here : Connect a DataBase and Make Calculations of the Var : Result2 */
System.out.println(Result2); 

MyJTextField.setText("Result3 is calculated now….”); 
/* here : Connect a DataBase and Make Calculations of the Var : Result3 */
System.out.println(Result3); 

// and so ….

运行代码将执行以下操作:

  • 在控制台中打印:开始.... !!
  • 计算Result1
  • 在控制台中打印Result1的值
  • 计算Result2
  • 在控制台中打印Result2的值
  • 计算Result3
  • 在控制台中打印Result3的值

此后,它会立即完全更新MyJTextField

非常感谢您提供有用的帮助。

3 个答案:

答案 0 :(得分:2)

我将在匿名java.lang.Runnable类中调用所有与Swing UI相关的方法,然后将其传递给SwingUtilities.invokeLater(Runnable runnable)来运行它。这样可以确保在EDT(事件分派线程)上调用Runnable的run()方法内部调用的UI操作。切勿在例如例如执行更长的计算的线程。参见下面的代码...

// non-ui thread
System.out.println("Start....!!");

// call on ui-thread (event dispatching thread)
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        MyJTextField.setText("Start....!!"); 
        MyJTextField.setText("Result1 is calculated now….”); 
    }
}

// non ui-thread again...
/* here : Connect a DataBase and Make Calculations of the Var : Result1 */
System.out.println(Result1); 

// call on ui-thread again (event dispatching thread)
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        MyJTextField.setText("Result2 is calculated now….”); 
    }
}

// and so ….

使用lambdas(Java8 +)的较短版本:

SwingUtilities.invokeLater(() -> MyJTextField.setText("Result2 is calculated now….”));

答案 1 :(得分:0)

如果您使用的是Java swing库,则UI是由特定线程呈现的,这意味着线程会在从主线程进行计算的不同时间更新UI。

您应该尝试在Swing组件上使用validate()repaint()方法,以正确地更新它们,如下所示:

MyJTextField.setText("Result1 is calculated now….”); 
MyJTextField.validate();
// or MyJTextField.repaint();

答案 2 :(得分:0)

  

它将立即完全更新。

所有代码都在Event Dispatch Thread (EDT)上执行,因此GUI仅在处理完成后才能重新绘制自身。

如果您的任务运行时间很长,则需要在单独的Thread上执行该任务,以免阻塞EDT,并且GUI可以自己重新绘制。

一种执行此操作的方法是使用SwingWorker。请阅读Concurrency上Swing教程中的部分,以获取有关EDT以及如何使用SwingWorker的更多信息。

如果要在完成数据库访问时更新GUI,则可以“发布”更新。这将确保在EDT上更新GUI。