我试图在JavaFX中添加一个字符串到ListView,同时处理,但它一直冻结我的GUI。
我试过下面的线程-但似乎不能让它为ListView工作。
有人知道如何/有一个例子,我如何在JavaFX中更新ListView,同时处理数据?
new Thread(new Runnable() {
@Override public void run() {
for (int i=1; i<=1000000; i++) {
final int counter = i;
Platform.runLater(new Runnable() {
@Override public void run() {
recentList.getItems().add(Integer.toString(counter));
}
});
}
}}).start();
使用Platform.runLater()是正确的方法。您还可以将Integer.toString(counter)的String结果存储在后台线程(而不是UI线程)中。顺便说一下,您应该使用String。valueOf(有一个线程在StackOverflow上讨论它)。
I 假设你的UI冻结是因为(非常简单的)循环的执行速度。
您还应该看看JavaFX中的并发性
你可以在列表中添加这些字符串后进行动画/ui更新,或者只使用一次Platform.runLater(不建议):
Platform.runLater(new Runnable() {
for (int i=1; i<=1000000; i++) {
final int counter = i;
@Override public void run() {
recentList.getItems().add(Integer.toString(counter));
}
}
});
你的GUI挂起,因为你正在阻塞JavaFX应用程序线程通过调用Platform.runLater()
连续在你的线程。
您可以通过在for循环中添加sleep
语句来执行quick fix
以避免它。
for (int i=1; i<=1000000; i++) {
final int counter = i;
Platform.runLater(new Runnable() {
@Override public void run() {
recentList.getItems().add(Integer.toString(counter));
}
});
// Add Sleep Time
Thread.sleep(some milli seconds);
}
要使用更合适和明智的方式,请使用AnimationTimer
,如
JavaFX -并发和更新标签