当前位置: 首页 > 知识库问答 >
问题:

JavaFX-在条件下重置ChangeListener中的复选框选择

戚同
2023-03-14

在我的JavaFX应用程序中,我在树形视图中使用复选框来更改节点的可见性。

  • 选中复选框=一些节点可见
  • 取消选中复选框=一些节点是不可见的

但是,在特殊情况下,应提示用户确认其选择,因为激活特定复选框时可能会出现问题。将打开一个对话框窗口,用户可以在其中选择“是”和“否”。如果用户选择“是”,节点将可见,一切正常。但如果用户选择“否”,则应再次取消选中该复选框。

我的想法是检查ChangeListener中的条件(在本例中,在对话框窗口中按“否”),如果为真,则将所选值设置为假。

但不管出于什么原因,它不起作用。之后,我发现它与TreeView刷新()方法一起工作。

  1. 为什么没有refresh()方法它就不能工作,为什么setSelected()被忽略

使用刷新()行将显示所需的行为:单击后复选框保持未选中,因为5

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.scene.Scene;
import javafx.scene.control.CheckBoxTreeItem;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.controlsfx.control.CheckTreeView;

public class HelloApplication extends Application {

    enum Names { TEST1, TEST2, TEST3, TEST4 }

    private final CheckTreeView<String> checkTreeView = new CheckTreeView<>();

    @Override
    public void start(Stage stage) {
        VBox vBox = new VBox();
        Scene scene = new Scene(vBox, 500, 500);
        setTreeView();
        vBox.getChildren().add(checkTreeView);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }


    public void setTreeView() {
        CheckBoxTreeItem<String> rootItem = new CheckBoxTreeItem<>("Root");
        rootItem.setExpanded(true);
        for (Names name : Names.values()) {
            CheckBoxTreeItem<String> item = new CheckBoxTreeItem<>(name.toString(), null);
            item.selectedProperty().addListener(this.onSelectionChanged(item));
            rootItem.getChildren().add(item);
        }
        this.checkTreeView.setRoot(rootItem);
    }

    private ChangeListener<Boolean> onSelectionChanged(CheckBoxTreeItem<String> item) {
        return (observableValue, previousChoice, newChoice) -> {

            if (newChoice) { // if checkbox is selected
                // if anything happens... for example press a "no" button in a dialog window
                if (5 > 4) {
                    System.out.println("reset checkbox status");
                    item.setSelected(previousChoice);
                }
            }

            // it works with refresh:
            // this.checkTreeView.refresh();
        };
    }
}

共有1个答案

鄢禄
2023-03-14

您正在过早地重置复选框项。它尚未完成事件处理。

您想等到它完成后再重置它。使用平台。请稍后运行,以确保在处理完所有挂起事件后将其重置:

Platform.runLater(() -> item.setSelected(previousChoice));
 类似资料:
  • 主要内容:创建复选框,复选框状态,示例复选框允许用户进行多项选择。例如,当订购披萨时,可以添加多个调味料。单选按钮或切换按钮用于单选或无选择。 创建复选框 我们可以使用中的构造函数来创建的对象。 创建不带标题的复选框,如下代码所示 - 要创建带有字符串标题的复选框,如下代码所示 - 创建复选框后,我们可以更改其文本并将其选中。 复选框状态 可以使用来表示三个状态: Yes No Not Applicable(不适用) “不适用”状态是

  • 我的JavaFx FXML应用程序有问题。 当我在表单上选中复选框时,我想根据单击的复选框执行一个方法。是否有任何方法可以将复选框的名称传递给该方法,以便对其执行一些有条件的工作? 我有两个复选框,只能选择一个。当我单击其中一个时,应取消选择另一个,反之亦然。显然,下面的代码将无法工作,因此我希望传递被单击对象的名称。 任何帮助都将不胜感激,非常感谢。

  • 如果选中复选框D并取消选中其他复选框,我希望选中复选框K和F。同样,如果选中复选框I,则前面的复选框I将被选中,下面的复选框将被取消选中。我的html代码是: 我为此所做的是: 这看起来很乱,还有一个很酷的过程吗???

  • 下面是我的代码。 问题是当我选中一个复选框时,包括选中循环视图中的其他复选框。但当我签入适配器时,项目被正确添加,但复选框被复制。 例如:如果我选中了第一项复选框,向下滚动第16项复选框也会被选中。取消选中该复选框也将取消选中第一项。

  • 我已经试过了所有可能的方法,但还是没有成功。我有一个带有的模式窗口,我希望当模式打开时,的选中或取消选中应该基于数据库值。(我已经与其他表单字段一起工作了。)我开始试着检查,但没有用。 我的HTML分区: 和jQuery: 我也尝试了和其他在论坛上看到的,但似乎都不起作用。 有人能给我指出正确的方法吗? 好吧,我真的漏了点什么。如果复选框在页面中,我可以使用代码勾选/取消勾选,但如果它在模态窗口中