在javafx8中使用JMS时如何启用和禁用进度指示器

时间:2016-04-04 15:59:44

标签: jms javafx-8 fxml progress-indicator

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组件将永远被禁用。

任何改善此建议的建议都会有所帮助。

1 个答案:

答案 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();
    });
}

}