运行以下代码时,我在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 ….
运行代码将执行以下操作:
此后,它会立即完全更新MyJTextField
。
非常感谢您提供有用的帮助。
答案 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。