我的JavaFx FXML应用程序存在问题。
当我在表单上选中一个复选框时,我想根据单击的复选框执行一个方法。有没有办法可以将复选框的名称传递给方法,以便我可以对它执行一些有条件的工作?
我有两个复选框,只能选择一个。当我点击一个时,另一个应该被取消选择,反之亦然。显然,下面的代码不起作用,所以我希望传递被点击的对象的名称。
任何帮助将不胜感激, 非常感谢。
@FXML private void updateRcs(){
if (chkRcsuri.isSelected()){
chkRcsuri2.setSelected(false);
}
if (chkRcsuri2.isSelected()){
chkRcsuri.setSelected(false);
}
}
答案 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或更高版本。