选中复选框时触发JAVAFX事件

时间:2012-12-05 15:37:24

标签: javafx

我的JavaFx FXML应用程序存在问题。

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

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

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

@FXML private void updateRcs(){

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

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

}

5 个答案:

答案 0 :(得分:24)

您可以使用更改跟踪或使用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);

答案 1 :(得分:7)

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

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

答案 2 :(得分:1)

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

@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,而副verca。这样你也可以避免取消选择一个问题,另一个自动重新选择自己。

答案 3 :(得分: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;

        }
    ...

答案 4 :(得分:0)

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

a)对于阅读源代码和

而言似乎更清晰(至少对我而言,与监听器定义相比)

b)在复选框上定义changeListener给我带来了一些问题。

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

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

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

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