2012-12-05 47 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; 

     } 
    ...