on action i向jms主题发送消息以处理数据,我有一个回调方法,当数据准备好并加载TableView时调用该方法。
public void onEnter(ActionEvent actionEvent) throws IOException, InterruptedException {
new Thread() {
public void run() {
Platform.runLater(() -> {
progressIndicator.setVisible(true);
scrollPane.setDisable(true);
});
// Construct the message and publish it to a topic
};
}.start();
}
}
public void callBackMethod(List<Object> list ) {
progressIndicator.setVisible(false);
scrollPane.setDisable(false);
//load data in the table
}
这就是我想要的,但是如果在消息传递系统端出现问题,那么回调永远不会被调用,UI组件将永远被禁用。
任何改善此建议的建议都会有所帮助。
答案 0 :(得分:2)
据推测,如果消息系统无法发送消息,消息系统将抛出某种异常,因此您需要一种方法来捕获并正确恢复。如果您使用JavaFX&#34;任务&#34;然后,当发生这种情况时,你会得到事件。如果合适的话,您仍然必须处理接收方的失败,或实施某种超时。
此外,您正在启动一个主题,然后立即使用RunLater将作业投入到FXAT中。根据定义,onEnter事件处理程序已经在FXAT上运行,所以你可以在启动线程之前完成你的GUI工作(或者我建议的任务)。这是一个展示如何启动任务的示例,如果失败则会清除,但有异常:
public class SampleTask extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Hello World!");
BorderPane root = new BorderPane();
ProgressIndicator progressIndicator = new ProgressIndicator(0);
ScrollPane scrollPane = new ScrollPane();
Button button = new Button("Start");
root.setTop(progressIndicator);
root.setCenter(scrollPane);
progressIndicator.setVisible(false);
root.setBottom(button);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
button.setOnAction(actionEvent -> {
progressIndicator.setVisible(true);
scrollPane.setDisable(true);
Task<Void> testTask = new Task<Void>() {
@Override
protected Void call() throws Exception {
// Send the message
return null;
}
};
testTask.setOnFailed(event -> {
progressIndicator.setVisible(false);
scrollPane.setDisable(false);
});
new Thread(testTask).start();
});
}
}