如何在处理某些内容时禁用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();
答案 0 :(得分:1)
根据您发布的代码,在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不会给你那么讨厌&#39;应用程序已经停止响应&#39;业务),然后在线程内部,只要你想在GUI上改变某些东西,使用Platform.runLater()语法,从技术上讲,你正在制作一个新的&#39; Runnable&#39; runLater方法中的对象,但是由于lambda表达式,你不必担心!如果您不使用Platform.runLater()
,那么您将无法获得Javafx应用程序线程&#39;尝试更新内容时出现异常。
另外值得注意的是,我认为在javafx 2. *(java 7)它的btn.setEnable(false)
而不是btn.setDisable(true)
只是改变了它们的方式。同样的效果。
答案 1 :(得分:0)
使用f.f.g代码
btn.setEnabled(false);
在handle方法中,然后:
btn.setEnabled(true);