提问者:小点点

选择复选框时触发JAVAFX事件


我的JavaFx FXML应用程序有问题。

当我在表单上选中复选框时,我想根据单击的复选框执行一个方法。是否有任何方法可以将复选框的名称传递给该方法,以便对其执行一些有条件的工作?

我有两个复选框,只能选择一个。当我单击其中一个时,应取消选择另一个,反之亦然。显然,下面的代码将无法工作,因此我希望传递被单击对象的名称。

任何帮助都将不胜感激,非常感谢。

@FXML private void updateRcs(){

    if (chkRcsuri.isSelected()){
        chkRcsuri2.setSelected(false);
    }

    if (chkRcsuri2.isSelected()){
        chkRcsuri.setSelected(false);
    }

}

共3个答案

匿名用户

您可以使用更改跟踪或使用JavaFX的事件处理机制<有这样的复选框,

final CheckBox chk1 = new CheckBox("chk 1");
final CheckBox chk2 = new CheckBox("chk 2");

变更跟踪

chk1.selectedProperty().addListener(new ChangeListener<Boolean>() {
    @Override
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
        chk2.setSelected(!newValue);
    }
});

chk2.selectedProperty().addListener(new ChangeListener<Boolean>() {
    @Override
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
        chk1.setSelected(!newValue);
    }
});

使用事件处理

EventHandler eh = new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        if (event.getSource() instanceof CheckBox) {
            CheckBox chk = (CheckBox) event.getSource();
            System.out.println("Action performed on checkbox " + chk.getText());
            if ("chk 1".equals(chk.getText())) {
                chk2.setSelected(!chk1.isSelected());
            } else if ("chk 2".equals(chk.getText())) {
                chk1.setSelected(!chk2.isSelected());
            }
        }
    }
};

chk1.setOnAction(eh);
chk2.setOnAction(eh);

匿名用户

单选按钮不会给你一个互斥的选择吗?只要确保你设置的组名是相同的——选择一个会自动取消选择另一个,你可以在动作事件中放入额外的逻辑。

比尝试围绕复选框重写相同的功能要好。

匿名用户

所以我试图做类似的事情,除了我有多个复选框,然后一个复选框与其他复选框一起使用是荒谬的。我创建了两个独立的侦听器,并将一个通用的设置为主框,一个专用的设置为例外。

@FXML private CheckBox redCB = new CheckBox();
@FXML private CheckBox blueCB = new CheckBox();
@FXML private CheckBox greenCB = new CheckBox();
@FXML private CheckBox whiteCB = new CheckBox();
@FXML private CheckBox blackCB = new CheckBox();
@FXML private CheckBox colorlessCB = new CheckBox();

//assigning listeners
redCB.selectedProperty().addListener(colorCheckChange);
blueCB.selectedProperty().addListener(colorCheckChange);
greenCB.selectedProperty().addListener(colorCheckChange);
whiteCB.selectedProperty().addListener(colorCheckChange);
blackCB.selectedProperty().addListener(colorCheckChange);
colorlessCB.selectedProperty().addListener(colorlessCheckChange);
                       //note: this is the only different one^^^

//making listeners
ChangeListener colorCheckChange = new ChangeListener<Boolean>() {
    @Override
    public void changed(ObservableValue<? extends Boolean> ov,
        Boolean old_val, Boolean new_val) {
        if (new_val)
            colorlessCB.setSelected(false);
    }};
ChangeListener colorlessCheckChange = new ChangeListener<Boolean>() {
    @Override
    public void changed(ObservableValue<? extends Boolean> ov,
        Boolean old_val, Boolean new_val) {
        if (new_val)
        {
            redCB.setSelected(false);
            blueCB.setSelected(false);
            greenCB.setSelected(false);
            blackCB.setSelected(false);
            whiteCB.setSelected(false);
        }
    }
};

第一种基本上只是确保在尝试选择其他颜色时未选择无颜色的SCB,反之亦然。这样还可以避免取消选择一个,而另一个自动重新选择自身的问题。