你好,这是我第一次问堆栈。我遇到了disablebleProperty()
函数的问题。它让我Stage
深灰色,看起来很糟糕。如何运行某些Task
时,如何禁用单击我的舞台,如下面的代码所示:
buttonName.setOnAction((event) -> {
Task task = new Task() {
@Override
protected Integer call() throws Exception {
try {
buttonName.getScene().setCursor(Cursor.WAIT);
buttonName.getScene().getRoot().disableProperty().bind(primaryStage.getScene().cursorProperty().isEqualTo(Cursor.WAIT));
anotherFunction();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
buttonName.getScene().setCursor(Cursor.DEFAULT);
}
return null;
}
};
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
});
答案 0 :(得分:1)
您不应该从JavaFX应用程序线程以外的线程更新ui。由于interface SomeProps {
text: string;
label?: string;
}
class SomeClass extends React.Component<SomeProps> {
...
}
在单独的线程上运行,因此您不应该在那里运行代码。同样绑定到curser属性而不是调用Task.call
似乎是一个坏主意,特别是因为你永远不会绑定属性。
使用setDisable(false)
的事件处理程序来处理任务的成功完成。 (onSucceeded
和onFailed
可用于完成任务的不同方式,这在您发布的代码段中不会发生。)
onCanceled
要禁用场景中的其他控件,您可以改为禁用/重新启用场景的根目录:
buttonName.setOnAction((event) -> {
buttonName.getScene().setCursor(Cursor.WAIT);
buttonName.setDisable(true);
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
try {
anotherFunction();
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
};
task.setOnSucceeded(evt -> {
buttonName.getScene().setCursor(Cursor.DEFAULT);
buttonName.setDisable(true);
});
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
});
为了防止灰色外观看起来JavaFX应用于禁用的控件(将不透明度设置为0.4),您可以应用具有更高优先级的不同不透明度,例如通过设置代码
的不透明度buttonName.getScene().getRoot().setDisable(newValue);
或使用自定义样式表应用样式
buttonName.setOpacity(1);
*:disabled {
-fx-opacity: 1;
}