将两个ToggleButtons绑定到一个BooleanProperty

时间:2018-01-11 20:33:11

标签: java javafx properties

我有两个ToggleButtons,我希望它们都绑定到一个布尔属性,这样当选择一个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())?

2 个答案:

答案 0 :(得分:4)

您可以使用侦听器执行此操作:

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即可。注意this question,如果只是它们看起来的情况。

答案 1 :(得分:1)

这也可以通过在ToggleGroup's selectedToggleProperty上设置一个监听器来完成。

首先必须设置初始按钮。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class ToggleButtonExperiments extends Application
{

    @Override
    public void start(Stage primaryStage) throws Exception
    {
        primaryStage.setTitle("HBox Experiment 1");

        ToggleButton toggleButton1 = new ToggleButton("Left");
        ToggleButton toggleButton2 = new ToggleButton("Right");

        ToggleGroup toggleGroup = new ToggleGroup();
        toggleButton1.setSelected(true);//set initial button!!!!!

        toggleGroup.selectedToggleProperty().addListener((obs, oldTog, newTog) -> {
            if (newTog == null) {
                oldTog.setSelected(true);
            }
        });

        toggleButton1.setToggleGroup(toggleGroup);
        toggleButton2.setToggleGroup(toggleGroup);

        HBox hbox = new HBox(toggleButton1, toggleButton2);

        Scene scene = new Scene(hbox, 200, 100);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

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