【问题标题】:Show labels in JavaFX only when a CheckBox is checked仅在选中 CheckBox 时在 JavaFX 中显示标签
【发布时间】:2021-11-23 08:25:18
【问题描述】:

我正在尝试使用 JavaFX 配置一个小型 GUI。在开始时,可​​以使用两个文本字段提供有关日期和时间(当您工作时)的一些信息。 下方有一个复选框,您可以检查是否要“选择更多天数?”。

现在我要启用两种可能性:

a) 当您选中该框时,您可以看到更多文本字段以授予有关不同日期的更多信息

b) 当你错误地选中该框时,当该框未被选中时文本字段应该消失并且屏幕与开始时相同

我已经有了以下部分代码。当我选中该框时,我可以看到更多的文本字段,但是当未选中该框时,文本字段仍然存在。

CheckBox moreDays= new CheckBox("Choose more days?");
        EventHandler<ActionEvent> showMoreLabels = new EventHandler<ActionEvent>() {

        public void handle(ActionEvent e)
        {
            if (moreDays.isSelected()) {

            Label dayTwo= new Label("Day Two:");
            pane.add(dayTwo, 0, 7);
            final TextField secondDay = new TextField();

            pane.add(secondDay, 1, 7);

            Label dayThree= new Label("Day Three:");
            pane.add(dayThree, 2, 7);
            final TextField thirdDay= new TextField();

            pane.add(thirdDay, 3, 7);
        } else {


        }
        
    }
    };

    moreDays.setOnAction(showMoreLabels);

我试图创建一个if-else-statement,当检查复选框时,应显示文本字段,如果语句是false,则不会看到文本字段。但如前所述,它不起作用。我希望有人可以帮助我。

提前致谢!

【问题讨论】:

  • ` else { pane.getChildren().removeAll(dayTwo, secondDay, dayThree,thirdDay); }`,这些控件的范围发生了明显的变化。

标签: user-interface javafx checkbox actionevent


【解决方案1】:

这里有几个其他的解决方案:

Label dayTwo = new Label("Day Two:");    
TextField secondDay = new TextField();    
Label dayThree = new Label("Day Three:");    
TextField thirdDay = new TextField();

CheckBox moreDays = new CheckBox("Choose more days?");

moreDays.setOnAction(e -> {
    if (moreDays.isSelected()) {
        pane.add(dayTwo, 0, 7);
        pane.add(secondDay, 1, 7);
        pane.add(dayThree, 2, 7);
        pane.add(thirdDay, 3, 7);
    } else {
        pane.getChildren().removeAll(dayTwo, secondDay, dayThree, thirdDay);
    }

});

Label dayTwo = new Label("Day Two:");
pane.add(dayTwo, 0, 7);

TextField secondDay = new TextField();
pane.add(secondDay, 1, 7);

Label dayThree = new Label("Day Three:");
pane.add(dayThree, 2, 7);

TextField thirdDay = new TextField();
pane.add(thirdDay, 3, 7);

bindVisibility(moreDays, dayTwo, secondDay, dayThree, thirdDay);


// ...

private void bindVisibility(CheckBox check, Node... nodes) {
    for (Node node : nodes) {
        node.visibleProperty().bind(check.selectedProperty());
        node.managedProperty().bind(check.selectedProperty());
    }
}

【讨论】:

  • 谢谢,我会尝试两个版本。只是为了我的理解,方法 bindVisibility 是做什么的?
  • @DaveDarell 它将可见性绑定到复选框的状态。 (见docs。)
  • 非常感谢您的快速回复:)
【解决方案2】:

让我们稍微修改一下你的代码:

Label dayTwo = new Label("Day Two:");
dayTwo.setVisible(false);
pane.add(dayTwo, 0, 7);

TextField secondDay = new TextField();
secondDay.setVisible(false);
pane.add(secondDay, 1, 7);

Label dayThree = new Label("Day Three:");
dayThree.setVisible(false);
pane.add(dayThree, 2, 7);

TextField thirdDay = new TextField();
thirdDay.setVisible(false);
pane.add(thirdDay, 3, 7);

CheckBox moreDays = new CheckBox("Choose more days?");

EventHandler<ActionEvent> showMoreLabels = new EventHandler<ActionEvent>() {

    public void handle(ActionEvent e) {
        dayTwo.setVisible(moreDays.isSelected());
        secondDay.setVisible(moreDays.isSelected());
        dayThree.setVisible(moreDays.isSelected());
        thirdDay.setVisible(moreDays.isSelected());
   }
};

moreDays.setOnAction(showMoreLabels);

我强烈建议您为标签等找到更好的名称(例如 labelDayTwo)。

【讨论】:

  • 您可能也想调用setManaged(...),因此标签和文本字段在不可见时不会占用 UI 中的空间。 (或者选中框时调用add(),未选中时调用remove()。)
  • setManaged() 命令我还不知道,但听起来它可以帮助我从开始屏幕保护空间,谢谢这个提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
相关资源
最近更新 更多