17

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

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

我有两个复选框,只能选择一个。当我单击一个时,应取消选择另一个,反之亦然。显然下面的代码将不起作用,所以我希望传递被单击的对象的名称。

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

@FXML private void updateRcs(){

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

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

}
4

5 回答 5

33

您可以使用更改跟踪或使用 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);
于 2012-12-05T17:58:58.607 回答
7

单选按钮不会给你一个相互排斥的选择吗?只需确保您将组名设置为相同 - 选择一个然后会自动取消选择另一个,您可以在 Action 事件中添加额外的逻辑。

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

于 2014-02-15T20:49:40.470 回答
2

所以我试图做类似的事情,除了我有多个复选框,然后一个与其他复选框一起选择是荒谬的。我制作了两个单独的监听器,并将一个通用监听器设置为主框,一个专用监听器用于异常。

@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);
        }
    }
};

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

于 2015-12-09T21:45:41.387 回答
1

这是我的解决方案。但请确保a变量适合您

//First in FXML file 
<CheckBox fx:id="chkbxAuto" mnemonicParsing="false" onAction="#autoConfig" text="Auto" />

// in controler  
public class FXMLController implements Initializable {
    private static int a = 0;
    //references to lables
    ....
    @FXML
    private Label lblStateValue; 
    @FXML
    private Group grpSetting; // a group of elements which I want to be disabled and enabled 
    ... 
    @FXML
    private void autoConfig(ActionEvent event) {
            System.out.println("Configing automatically"); 
             a++;
             if(a%2==1){
                 lblStateValue.setText("Auto configuration enabled"); // it change a lable to show the state 
                 grpSetting.setDisable(true); // it disable a group of elements
             }
            else{
                 lblStateValue.setText("Auto configuration disabled");
                 grpSetting.setDisable(false);
             }
            a%=10;

        }
    ...
于 2017-04-02T22:27:15.150 回答
0

我知道这个问题已经很老了,但是我在寻找同样的问题时发现了。我找到了一个解决方案

a)对于阅读源代码和

b)在 checkBox 上定义 changeListener 给了我一些问题。

无论如何,我的解决方案是为复选框定义一个 onAction 函数。

yourCheckboxName.setOnAction(this::aFunctionName);
...
void aFunctionName() {

    if(yourCheckboxName.isSelected()) {            
        doThis()
    } else {
        doThat()
    }
}

注意这需要Java8或更高版本。

于 2018-09-12T06:48:18.193 回答