我有一个TableView
的应用程序,它有一个附加的侦听器,所以一旦检测到更改就会刷新,但问题是我得到了java.lang.IllegalStateException: Not on FX application thread; currentThread = Smack Listener Processor (0)
。
这是我的代码:
/**
* This function resets the pagination pagecount
*/
public void resetPage() {
try {
System.out.println("RESET");
int tamRoster = this.loginManager.getRosterService().getRosterList().size();
paginationContactos.setPageCount((int)(Math.ceil(tamRoster*1.0/limit.get())));
int tamEnviados = this.loginManager.getRosterService().getEnviadasList().size();
paginationEnviadas.setPageCount((int)(Math.ceil(tamEnviados*1.0/limit.get())));
int tamRecibidas = this.loginManager.getRosterService().getRecibidasList().size();
paginationRecibidas.setPageCount((int)(Math.ceil(tamRecibidas*1.0/limit.get())));
} catch (Exception e) {
e.printStackTrace();
}
}
public void doSomething () {
this.loginManager.getRosterService().getRosterList().addListener(new ListChangeListener<RosterDTO>() {
@Override
public void onChanged(
javafx.collections.ListChangeListener.Change<? extends RosterDTO> c) {
// TODO Auto-generated method stub
resetPage();
while (c.next()) {
if (c.wasPermutated()) {
System.out.println("PERM");
} else if (c.wasUpdated()) {
System.out.println("UPD");
} else {
System.out.println("ELSE");
}
}
}
});
}
尽管它进入了resetPage方法,我得到了那个例外。 为什么会这样? 我该如何解决? 提前谢谢。
答案 0 :(得分:104)
无法从非应用程序线程直接更新用户界面。相反,使用Platform.runLater()
和Runnable对象中的逻辑。例如:
Platform.runLater(new Runnable() {
@Override
public void run() {
// Update UI here.
}
});
作为lambda表达式:
// Avoid throwing IllegalStateException by running from a non-JavaFX thread.
Platform.runLater(
() -> {
// Update UI here.
}
);
答案 1 :(得分:4)
JavaFX代码允许从JavaFX应用程序线程更新UI。但是从上面的异常消息中可以看出它没有使用FX Application线程。
您可以解决的一种方法是从resetPage方法启动FX Application线程并在那里进行修改。
答案 2 :(得分:0)
我遇到了类似的问题,我使用Platform.runLater()
解决了 没有 的问题:
“ java.lang.IllegalStateException:不在FX应用程序线程上; currentThread = Thread-6”
Button play = new Button("Play");
EventHandler<ActionEvent> playHandler = e1 -> {
Runnable runnable = () -> {
play.setText("Pause");
EventHandler<ActionEvent> timelineHandler e2 -> play();
timeline = new Timeline(new KeyFrame(Duration.millis(2000), timelineHandler));
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
};
Thread t = new Thread(runnable);
t.start();
};
play.setOnAction(playHandler);
已解决! 将所有无关的内容移到runnable
lambda之外:
Button play = new Button("Play");
EventHandler<ActionEvent> playHandler = e1 -> {
play.setText("Pause");
Runnable runnable = () -> {
EventHandler<ActionEvent> timelineHandler e2 -> play();
timeline = new Timeline(new KeyFrame(Duration.millis(2000), timelineHandler));
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
};
Thread t = new Thread(runnable);
t.start();
};
play.setOnAction(playHandler);