Hallo zusammen,
Ich stehe vor dem Problem, dass meine Werte aus der Combobox nicht im GUI angezeigt werden.
In der Klasse public class AnimalEditDialogController konnte ich die Werte erfolgreich programmieren:
Java:
publicclassAnimalEditDialogController{ObservableList<String> bestellungnotwendigList =FXCollections.observableArrayList("Ja","Nein");@FXMLprivateComboBox<String> bestellungnotwendigBox;/**
* Sets the animal to be edited in the dialog.
*
* @param animal
*/publicvoidsetAnimal(Animal animal){this.animal = animal;
bestellungnotwendigBox.setItems(bestellungnotwendigList);}/**
* Called when the user clicks ok.
*/@FXMLprivatevoidhandleOk(){if(isInputValid()){
animal.setBestellungnotwendig(bestellungnotwendigBox.getPromptText());
okClicked =true;
dialogStage.close();}}
Leider funktioniert jedoch die Anzeige der Combobox-Werte nach dem Abspeichern in der public class AnimalOverviewController nicht, obwohl ich definiert habe, dass diese angezeigt werden sollen:
Java:
privatevoidshowAnimalDetails(Animal animal){if(animal !=null){// Fill the labels with info from the animal object.
bestellungnotwendigLabel.setText(animal.getBestellungnotwendig());}else{
bestellungnotwendigLabel.setText("");}}
2 Fragen:
- Hast du das mit Swing / Awt oder mit JavaFx programmiert?
- Kannst du mal den ganzen Code posten, vor allem da, wo die GUI Elemente initialisiert werden?
2 Fragen:
- Hast du das mit Swing / Awt oder mit JavaFx programmiert?
- Kannst du mal den ganzen Code posten, vor allem da, wo die GUI Elemente initialisiert werden?
Ich glaube dass sollte Javafx sein wegen FXCollections.
@Rubberduck
Kann es sein dass deine setAnimal Methode nicht aufgerufen wird sodass die Combobox nicht initialisiert wird? Wenn es sowieso nur um ja oder nein wert geht, warum nicht Check box? Ansonsten würde ich die Combobox in der initialize Methode befüllen.
Zu 2: Hier die Klasse, in welcher ich die Checkbox initialisiert habe:
@lam_tr: Ja, dass scheint wohl das Problem zu sein. Die Combobox in der initialize Methode zu befüllen, habe ich bereits versucht - leider erfolglos.
Danke für den Tip mit der Checkbox, werde ich gerne ausprobieren.
Java:
packagech.animal.view;importjavafx.collections.FXCollections;importjavafx.collections.ObservableList;importjavafx.fxml.FXML;importjavafx.scene.control.Alert;importjavafx.scene.control.Alert.AlertType;importjavafx.scene.control.ComboBox;importjavafx.scene.control.TextField;importjavafx.stage.Stage;importch.animal.model.Animal;importch.animal.util.DateUtil;/**
* Dialog to edit details of an animal.
*
* @author Damian Krebs
*/publicclassAnimalEditDialogController{ObservableList<String> bestellungnotwendigList =FXCollections.observableArrayList("Ja","Nein");publicObservableList<String>getBestellungnotwendigList(){return bestellungnotwendigList;}publicvoidsetBestellungnotwendigList(ObservableList<String> bestellungnotwendigList){this.bestellungnotwendigList = bestellungnotwendigList;}@FXMLprivateTextField tierArtField;@FXMLprivateTextField futterArtField;@FXMLprivateTextField aktuellerBestandField;@FXMLprivateTextField mengeneinheitField;@FXMLprivateComboBox<String> bestellungnotwendigBox;@FXMLprivateTextField bestelldatumField;privateStage dialogStage;privateAnimal animal;privateboolean okClicked =false;/**
* Initializes the controller class. This method is automatically called
* after the fxml file has been loaded.
*/@FXMLprivatevoidinitialize(){}/**
* Sets the stage of this dialog.
*
* @param dialogStage
*/publicvoidsetDialogStage(Stage dialogStage){this.dialogStage = dialogStage;}/**
* Sets the animal to be edited in the dialog.
*
* @param animal
*/publicvoidsetAnimal(Animal animal){this.animal = animal;
tierArtField.setText(animal.getTierArt());
futterArtField.setText(animal.getFutterArt());
aktuellerBestandField.setText(Double.toString(animal.getAktuellerBestand()));
mengeneinheitField.setText(animal.getMengeneinheit());//bestellungnotwendigBox.setValue("Ja");
bestellungnotwendigBox.setItems(bestellungnotwendigList);
bestelldatumField.setText(DateUtil.format(animal.getBestelldatum()));
bestelldatumField.setPromptText("dd.mm.yyyy");}/**
* Returns true if the user clicked OK, false otherwise.
*
* @return
*/publicbooleanisOkClicked(){return okClicked;}/**
* Called when the user clicks ok.
*/@FXMLprivatevoidhandleOk(){if(isInputValid()){
animal.setTierArt(tierArtField.getText());
animal.setFutterArt(futterArtField.getText());
animal.setAktuellerBestand(Double.parseDouble(aktuellerBestandField.getText()));
animal.setMengeneinheit(mengeneinheitField.getText());
animal.setBestellungnotwendig(bestellungnotwendigBox.getPromptText());
animal.setBestelldatum(DateUtil.parse(bestelldatumField.getText()));
okClicked =true;
dialogStage.close();}}/**
* Called when the user clicks cancel.
*/@FXMLprivatevoidhandleCancel(){
dialogStage.close();}/**
* Validates the user input in the text fields.
*
* @return true if the input is valid
*/privatebooleanisInputValid(){String errorMessage ="";if(tierArtField.getText()==null|| tierArtField.getText().length()==0){
errorMessage +="No valid tier art!\n";}if(futterArtField.getText()==null|| futterArtField.getText().length()==0){
errorMessage +="No valid futter art!\n";}if(aktuellerBestandField.getText()==null|| aktuellerBestandField.getText().length()==0){
errorMessage +="No valid aktueller bestand!\n";}else{// try to parse the aktueller bestand into an double.try{Double.parseDouble(aktuellerBestandField.getText());}catch(NumberFormatException e){
errorMessage +="No valid aktueller bestand (must be an double)!\n";}}if(mengeneinheitField.getText()==null|| mengeneinheitField.getText().length()==0){
errorMessage +="No valid mengen einheit!\n";}if(bestelldatumField.getText()==null|| bestelldatumField.getText().length()==0){
errorMessage +="No valid bestelldatum!\n";}else{if(!DateUtil.validDate(bestelldatumField.getText())){
errorMessage +="No valid bestelldatum. Use the format dd.mm.yyyy!\n";}}if(errorMessage.length()==0){returntrue;}else{// Show the error message.Alert alert =newAlert(AlertType.ERROR);
alert.initOwner(dialogStage);
alert.setTitle("Invalid Fields");
alert.setHeaderText("Please correct invalid fields");
alert.setContentText(errorMessage);
alert.showAndWait();returnfalse;}}}
Also das hier wird aufgerufen wenn du deine FXML lädst? Versuch doch mal an der Stelle ein Breakpoint zu setzen und zu schauen was die ComboBox zurückliefert.
Code:
@FXML
public void initialize() {
bestellungnotwendigBox.setItems(bestellungnotwendigList);
}
Korrigiere mich wenn ich falsch liege, aber deine initialize()-Methode ist doch oben leer, d.h. es wird nicht initialisiert.
Es gibt nur einen Grund wenn die leer ist und es trotzdem funktioniert: Hast du 3 Files, ein fxml, einen Controller und eine Main-Klasse (extends Application)? Hast du das mit dem Scenebuilder gemacht, bzw. deine FXML GUI Element Variablen auch mit dem fxml file verknüpft?
Du liegst absolut richtig mit all deinen Punkten und ja, die FXML GUI Element Variablen habe ich auch mit dem fxml file verknüpft.
Hier sonst das komplette Projekt als zip, damit du die Zusammenhänge siehst...
Du liegst absolut richtig mit all deinen Punkten und ja, die FXML GUI Element Variablen habe ich auch mit dem fxml file verknüpft.
Hier sonst das komplette Projekt als zip, damit du die Zusammenhänge siehst...
Wie er schon gesagt hat, du musst in der initialize() Methode deine Textfelder und Checkboxen usw. setzen, Layout, Maße, evtl EventHandler usw.
Die initialize() ist bei einer (Javafx) Application wie der Konstruktor einer normalen Klasse, wenn der leer ist, dann hat die Klasse nix, bzw. die Attribute sind nicht initialisiert.
Danke @Lama-rajjo und @Hatsi09. Meint ihr in der intitialize Methode in der Klasse AnimalEditDialogController oder AnimalOverviewController? Nur komisch, dass alle anderen Werte korrekt angezeigt werden. Nur bei der Checkbox habe ich dieses Problem.
Ich bin immer noch der Meinung wenn du die Combobox in der initialize Methode setzt wird es gemacht. Ich würde sogar direkt Combobox.setItems(FXCollections.observableArraylist("yes", "No"))
Hallo Zusammen
Ich konnte das Problem nun mit Unterstützung einer Studienkollegin lösen. Es waren wirklich nur Kleinigkeiten, die man anpassen musste. Für diejenigen, welche and der Lösung interessiert sind, hier die Erleuchtung:
Bestellungnotwendig-Box
Die Reihenfolge wurde gedreht, zuerst muss immer das Item gesetzt werden und danach der Value. Der Value wurde auf den Feldwert angepasst (gemäss Java FX) alt: neu:
PullDown bei der Bestellungnotwendig-Edit Maske
Bei der Ja/Nein Pulldownbox wurde der Wert auf den GetValue geändert, vorher war da getprompttext.
So funktioniert es bei mir einwandfrei. Alt: Neu: