如何在处理某些内容时禁用 JavaFX 按钮(以防止用户向按钮发送垃圾邮件)?
primaryStage.setTitle("Update Stuff");
Label lbl = new Label();
lbl.setText("Nothing here yet");
Button btn = new Button();
btn.setText("Update");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
btn.setDisable(true); //I tried this, but to no avail
lbl.setText(getNumberOfViewers()); // this might take a few seconds, need to disable button during this time
btn.setDisable(false);
}
});
VBox root = new VBox();
root.setAlignment(Pos.CENTER);
root.getChildren().addAll(btn, lbl);
primaryStage.setScene(new Scene(root, 200, 100));
primaryStage.show();
最佳答案
根据您发布的代码,在 javafx 8 中将是这样的:
primaryStage.setTitle("Update Stuff");
Label lbl = new Label();
lbl.setText("Nothing here yet");
Button btn = new Button();
btn.setText("Update");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
btn.setDisable(true);
new Thread(()->{
final String numberOfViews = getNumberOfViewers();
Platform.runLater(()->{
lbl.setText(numberOfViews);
btn.setDisable(false);
});
}).start();
lbl.setText(getNumberOfViewers()); // this might take a few seconds, need to disable button during this time
}
});
VBox root = new VBox();
root.setAlignment(Pos.CENTER);
root.getChildren().addAll(btn, lbl);
primaryStage.setScene(new Scene(root, 200, 100));
primaryStage.show();
新线程将使 UI 线程永远不会被真正阻塞(Windows 不会给你带来令人讨厌的“应用程序已停止响应”业务),然后在线程内,任何时候你想在 GUI 上更改某些内容,请使用 Platform.runLater() 语法,从技术上讲,你正在 runLater 方法内创建一个新的“Runnable”对象,但由于 lambda 表达式,你无需担心这一点!如果您不使用 Platform.runLater()
,当您尝试更新内容时,您将收到“不在 Javafx 应用程序线程上”异常。
还值得注意的是,我认为在 javafx 2.* (java 7) 中,它是 btn.setEnable(false)
而不是 btn.setDisable(true)
只是他们的处理方式发生了变化。效果相同。
关于java - 如何在处理时禁用按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25746142/