2012-12-05 49 views
10

我的JavaFx FXML应用程序有问题。选择复选框时触发的JAVAFX事件

当我选择一个窗体上的复选框,我想执行一个基于点击复选框的方法。有什么办法可以将复选框的名称传递给方法,以便我可以对它执行一些有条件的工作?

我有两个复选框,只有一个可以选择。当我点击一个时,另一个应该被取消选择,反之亦然。显然,下面的代码不会工作,所以我正在寻找传递被点击的对象的名称。

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

@FXML private void updateRcs(){ 

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

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

} 

回答

22

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

岂不单选按钮给你一个相互排斥的选择?只要确保将groupname设置为相同 - 选择一个会自动取消选择另一个,并且您可以在Action事件中添加其他逻辑。

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

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。这样您也可以避免取消选择一个的问题,而另一个则自动重新选择。

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; 

     } 
    ...