【发布时间】:2019-10-22 19:43:11
【问题描述】:
我想在 JavaFX 中禁用多个相同“类型”的按钮。例如,我有多个用于不同操作的取消按钮,但我想同时启用/禁用它们,但似乎无法在 LinkedList 中访问它们。
在下面的“最小且可重现”示例中,当按下开始时,它应该启用(在 fxml 中默认禁用)取消按钮,但它没有。
DemoController.java
public class DemoController {
@FXML
Button startBtn;
@FXML
Button cancelBtn1; // disabled by default
@FXML
Button cancelBtn2; // disabled by default
@FXML
Tab tab1;
public SDK sdk;
List<Node> cancelBtnGroup = new LinkedList<Node>();
public void initialize() {
cancelBtnGroup.add(cancelBtn1);
cancelBtnGroup.add(cancelBtn2);
startBtn.setOnAction(event -> {
tab1.setDisable(true);
startBtn.setDisable(true);
System.out.println("Disabling cancel buttons");
HashMap<String, String> test = new HashMap<String, String>();
test.put("disableCancel", "false");
sdk.onEvent(test);
});
initializeSDK();
}
public void initializeSDK() {
sdk = new SDK() {
@Override
public void onEvent(HashMap<String, String> e) {
if(e.containsKey("disableCancel")) {
for(Node btn : cancelBtnGroup) {
btn.setDisable(Boolean.parseBoolean(e.get("disableCancel")));
}
}
}
};
}
}
似乎我以某种方式覆盖了按钮,但我不知道如何。我觉得我不了解某些功能的范围。我试图使代码尽可能简化和可读,所以如果我遗漏了一些非常明显的东西,这可能就是原因。 SDK 对象不包含具有相同名称的对象,以确保这不是我更改名称的问题。
【问题讨论】:
-
试试
for(Node btn : cancelBtnGroup.getChildren())。和setDisable(true)。 -
好吧,天才们,我现在已经把它全部改成了
setDisable(true),问题仍然存在,调用setDisable(true)没有任何作用。 -
您从原始代码中编辑了代码。编辑后的代码真的对你有用吗?或者,您还有问题吗?如果您仍然有问题,则问题可能出在您未显示的代码中。如果是这种情况,您可能需要提供minimal reproducible example 以获得进一步的帮助(没有人可以帮助您调试不存在的代码)。您拥有的不是 mcve,提供的链接描述了它是什么。
-
最佳点是有足够的代码,我们不需要推断任何东西来尝试重现问题。通常,这意味着有足够的代码可以编译和执行——由我们在我们自己的机器上进行,几乎不需要修改——但绝不会超过演示手头问题所需的代码。为了实现这个minimal reproducible example,您可能需要从头开始创建它,专门用于 Stack Overflow。该链接提供了一些策略来帮助将代码减少到所需的最少数量。
-
为了解决你经常使用的——讽刺,我假设——使用“天才”这个词(包括在你的编辑摘要评论中),请记住,你是拥有问题和你是寻求帮助的人。这个社区也是一群志愿者,他们绝对不欠你任何东西。要求提问者在他们期望帮助时付出努力并不过分。也就是说,您的新示例就足够了,至少对于point out the apparent problem。
标签: java javafx scenebuilder