我有两个ToggleButton,并且我希望它们都绑定到一个Boolean属性,以便当选择一个ToggleButton时,另一个ToggleButton不在,而BooleanProperty为true,反之亦然。

这是我尝试过的。

FXML文件:

<VBox xmlns:fx="http://javafx.com/fxml" fx:controller="my.package.MainController" styleClass="Tool" fx:id="root">
<HBox spacing="10">
    <fx:define>
        <ToggleGroup fx:id="modeToggleGroup"/>
    </fx:define>
    <ToggleButton fx:id="manualModeBtn" text="Manual Mode" selected="true" toggleGroup="$modeToggleGroup"/>
    <ToggleButton fx:id="automaticModeBtn" text="Automatic Mode" toggleGroup="$modeToggleGroup"/>
</HBox>
<!-- other stuff -->
</VBox>


控制器文件:

public class MainController {

    @FXML
    private ToggleButton manualModeBtn;
    @FXML
    private ToggleButton automaticModeBtn;

    private BooleanProperty isAutomaticMode;

    public void initialize() {
        isAutomaticMode = new SimpleBooleanProperty();
        automaticModeBtn.selectedProperty.bindBidirectional(isAutomaticMode);
    }
}


ToggleGroup确保不会同时选择两个按钮,但是我仍然可以取消选择这两个按钮,但我不希望这样做。

如何将另一个ToggleButton绑定到布尔属性的相反位置(即not())?

最佳答案

您可以使用侦听器来做到这一点:

public class MainController {

    @FXML
    private ToggleButton manualModeBtn;
    @FXML
    private ToggleButton automaticModeBtn;


    public void initialize() {
        manualModeBtn.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> automaticModeBtn.setSelected(! isNowSelected));
        automaticModeBtn.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> manualModeBtn.setSelected(! isNowSelected));

    }
}


请注意,RadioButton几乎已经具有此功能(对于单选按钮,您不能“取消选择”它),因此您可以简单地使用RadioButton s。请注意this question(如果只是它们外观的一种情况)。

10-04 17:19