2012-12-05 14 views
10

Meine JavaFx FXML-Anwendung hat ein Problem.JAVAFX-Ereignis ausgelöst, wenn ein Kontrollkästchen aktiviert

Wenn ich ein Kontrollkästchen in einem Formular auswähle, möchte ich eine Methode basierend auf dem angeklickten Kontrollkästchen ausführen. Gibt es eine Möglichkeit, dass ich den Namen des Kontrollkästchens an die Methode übergeben kann, damit ich bedingte Arbeit daran ausführen kann?

Ich habe zwei Kontrollkästchen und nur eines kann ausgewählt werden. Wenn ich auf einen klicke, sollte der andere abgewählt werden und umgekehrt. Offensichtlich funktioniert der unten stehende Code nicht, also suche ich nach dem Namen des Objekts, auf das geklickt wurde.

Jede Hilfe wäre willkommen, vielen Dank.

@FXML private void updateRcs(){ 

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

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

} 

Antwort

22

Sie können die Änderungsverfolgung verwenden oder den Ereignisbehandlungsmechanismus von JavaFX verwenden.
Mit Checkboxen wie dieses

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

Änderungsverfolgung

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

Ereignis Mit

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

Tasten, um eine für beide Seiten exklusive Auswahl geben Sie würden nicht Radio Handhabung? Stellen Sie nur sicher, dass Sie den Gruppennamen auf den gleichen Wert setzen. Wenn Sie einen auswählen, wird der andere automatisch deaktiviert und Sie können einfach zusätzliche Logik in das Aktionsereignis einfügen.

Besser als der Versuch, die gleiche Funktionalität um Checkboxen zu schreiben.

1

Also habe ich versucht, eine ähnliche Sache zu tun, außer ich hatte mehrere Kontrollkästchen und dann eine, die unsinnig wäre, in Verbindung mit den anderen auswählbar zu haben. Ich habe zwei separate Listener erstellt und einen allgemeinen für die Hauptboxen und einen speziellen für die Ausnahme eingerichtet.

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

Die erste im Grunde nur macht Sie sicher, dass colorlessCB nicht ausgewählt ist bei dem Versuch, die anderen Farben zu wählen und umge verca. Auf diese Weise vermeiden Sie auch das Problem, eine Auswahl aufzuheben, und die andere automatisch erneut auszuwählen.

1

Das ist meine Lösung. Aber stellen Sie sicher, dass die Variable a für Sie geeignet ist

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

     } 
    ... 
Verwandte Themen