2012-12-05 17 views
10

Moja aplikacja JavaFx FXML ma problem.Zdarzenie JAVAFX wyzwalane po zaznaczeniu pola wyboru

Po zaznaczeniu pola wyboru w formularzu chcę wykonać metodę opartą na zaznaczonym polu wyboru. Czy jest jakiś sposób, że mogę przekazać nazwę pola wyboru do metody, dzięki czemu mogę wykonać na nim pracę warunkową?

Mam dwa pola wyboru i można wybrać tylko jeden. Kiedy kliknę na jeden, drugi powinien zostać wyłączony i na odwrót. Oczywiście poniższy kod nie zadziała, dlatego szukam podania nazwy obiektu, który został kliknięty.

Każda pomoc będzie doceniona, wielkie dzięki.

@FXML private void updateRcs(){ 

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

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

} 

Odpowiedz

22

Możesz użyć śledzenia zmian lub użyć mechanizmu obsługi zdarzeń JavaFX.
Z wyboru, takich jak ten,

final CheckBox chk1 = new CheckBox("chk 1"); 
final CheckBox chk2 = new CheckBox("chk 2"); 

Śledzenie zmian

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

Korzystanie obsługi

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

Would not przyciski radiowe daje wzajemnie ekskluzywny wybór wydarzenie? Po prostu upewnij się, że nazwa grupy jest taka sama - wybranie jednej spowoduje automatyczne usunięcie drugiej i po prostu umieścisz dodatkową logikę w zdarzeniu Akcja.

Lepiej niż próbować ponownie napisać tę samą funkcjonalność w pobliżu pól wyboru.

1

Więc starałem się zrobić coś podobnego, z wyjątkiem tego, że miałem wiele pól wyboru, a następnie takie, które byłyby bezsensowne do wyboru w połączeniu z innymi. Zrobiłem dwóch oddzielnych słuchaczy i ustawiłem jeden ogólny cel do głównych pól, a jeden wyspecjalizowany do wyjątku.

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

Pierwszy z nich w zasadzie tylko upewnia się, że colorlessCB nie jest zaznaczone, starając się wybrać inne kolory i vice verca. W ten sposób unikniesz również problemu z usunięciem jednego, a drugi automatycznie ponownie wybierze się sam.

1

To jest moje rozwiązanie. Ale upewnij się, że zmienna a jest odpowiednia dla Ciebie

//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; 

     } 
    ... 
Powiązane problemy