[JavaFX] Wie kann man eine CheckBox in mehreren FXML-Dateien synchronisieren?
Also: Wenn in 1.fxml die CheckBox selceted ist, dass die in 2.fxml auch selected ist, wenn ich auf die 2.fxml gehe. Das Gleiche auch für not selected.
Bzw. kann man generell Items unter beliebigen FXML-Dateien auf den gleichen Status bringen?
1 Antwort
Beide Views sollten auf dasselbe Model-Objekt zurückgreifen. Dieses hält ein Property, welches du im Controller an deine Checkboxen bindest.
Also ungefähr so:
public class YourModel {
private final BooleanProperty activated = new SimpleBooleanProperty(false);
public BooleanProperty activatedProperty() {
return activated;
}
public final boolean isActivated() {
return activatedProperty().get();
}
public final void setActivated(boolean activated) {
activatedProperty().set(activated);
}
}
Controller:
public class YourController {
@FXML
private CheckBox yourCheckbox;
private final YourModel model;
public Controller(YourModel model) {
this.model = model;
}
@FXML
private void initialize() {
yourCheckbox
.selectedProperty()
.bindBidirectional(model.activatedProperty());
}
}
Den Controller würde man für diesen Fall manuell anlegen und dann für das View setzen.
var model = new YourModel();
var loader = new FXMLLoader(getClass().getResource("1.fxml"));
var controller = new YourController(model);
loader.setController(controller);
// do the same for 2.fxml ...
Oder man verwendet einen Standardkonstruktor und übergibt das Model stattdessen über eine Setter-Methode.
Nun, du hast wie gesagt ein einziges Model-Objekt, welches sich von mehreren Controllern und Views geteilt werden kann. Viel Code ist das eigentlich nicht.
Ich denke, dass das einen weitaus größeren Aufwand machen würde, wenn ich für fast 20 Elemente sowas anwenden würde.
Ich habe mich doch dazu entschlossen, einfach den Text von den Labels, RadioButtons und und und zu ändern. Dies braucht vielleicht weniger Code oder nimmt sich nichts, aber es verbraucht definitiv weniger Speicherplatz und (auch wenn es nur sehr gering ist) weniger Rechenleistung.
Oder ich habe es falsch verstanden 🤔