Combobox-Werte in GUI anzeigen

Diskutiere Combobox-Werte in GUI anzeigen im Java Basics - Anfänger-Themen Bereich.
R

Rubberduck

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:
public class AnimalEditDialogController {
   
    ObservableList<String> bestellungnotwendigList = FXCollections
            .observableArrayList("Ja", "Nein");
   
        @FXML
    private ComboBox<String> bestellungnotwendigBox;
   
    /**
     * Sets the animal to be edited in the dialog.
     *
     * @param animal
     */
    public void setAnimal(Animal animal) {
        this.animal = animal;

        bestellungnotwendigBox.setItems(bestellungnotwendigList);
    }
   
        /**
     * Called when the user clicks ok.
     */
    @FXML
    private void handleOk() {
        if (isInputValid()) {

            animal.setBestellungnotwendig(bestellungnotwendigBox.getPromptText());

            okClicked = true;
            dialogStage.close();
        }
    }
1586667627476.png

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:
private void showAnimalDetails(Animal animal) {
        if (animal != null) {
            // Fill the labels with info from the animal object.
           
            bestellungnotwendigLabel.setText(animal.getBestellungnotwendig());

        } else {
            bestellungnotwendigLabel.setText("");
        }
    }
1586668014750.png

Danke für die Hilfe.
 
Hatsi09

Hatsi09

Hallo,

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?
 
L

lam_tr

Hallo,

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.
 
Zuletzt bearbeitet:
R

Rubberduck

Hallo Zusammen

Zu 1: Ja, war mit JavaFX

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:
package ch.animal.view;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import ch.animal.model.Animal;
import ch.animal.util.DateUtil;

/**
 * Dialog to edit details of an animal.
 *
 * @author Damian Krebs
 */

public class AnimalEditDialogController {
    
    ObservableList<String> bestellungnotwendigList = FXCollections
            .observableArrayList("Ja", "Nein");
    
    public ObservableList<String> getBestellungnotwendigList() {
        return bestellungnotwendigList;
    }

    public void setBestellungnotwendigList(ObservableList<String> bestellungnotwendigList) {
        this.bestellungnotwendigList = bestellungnotwendigList;
    }

    @FXML
    private TextField tierArtField;
    @FXML
    private TextField futterArtField;
    @FXML
    private TextField aktuellerBestandField;
    @FXML
    private TextField mengeneinheitField;
    @FXML
    private ComboBox<String> bestellungnotwendigBox;
    @FXML
    private TextField bestelldatumField;


    private Stage dialogStage;
    private Animal animal;
    private boolean okClicked = false;
    
    /**
     * Initializes the controller class. This method is automatically called
     * after the fxml file has been loaded.
     */
    @FXML
    private void initialize() {
    }

    /**
     * Sets the stage of this dialog.
     *
     * @param dialogStage
     */
    public void setDialogStage(Stage dialogStage) {
        this.dialogStage = dialogStage;
    }
    
    /**
     * Sets the animal to be edited in the dialog.
     *
     * @param animal
     */
    public void setAnimal(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
     */
    public boolean isOkClicked() {
        return okClicked;
    }
    
    /**
     * Called when the user clicks ok.
     */
    @FXML
    private void handleOk() {
        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.
     */
    @FXML
    private void handleCancel() {
        dialogStage.close();
    }
    
    /**
     * Validates the user input in the text fields.
     *
     * @return true if the input is valid
     */
    private boolean isInputValid() {
        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) {
            return true;
        } else {
            // Show the error message.
            Alert alert = new Alert(AlertType.ERROR);
            alert.initOwner(dialogStage);
            alert.setTitle("Invalid Fields");
            alert.setHeaderText("Please correct invalid fields");
            alert.setContentText(errorMessage);
            
            alert.showAndWait();
            
            return false;
        }
    }
}
 
L

lam_tr

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

    }
 
Hatsi09

Hatsi09

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?
 
R

Rubberduck

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...
 

Anhänge

L

lam_tr

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...
Ohne den Code zu kompilieren, sehe dass die initialize Methode immer noch leer ist und die setAnimal Methode wird auch nicht aufgerufen von Overview
 
Hatsi09

Hatsi09

Ohne den Code zu kompilieren, sehe dass die initialize Methode immer noch leer ist und die setAnimal Methode wird auch nicht aufgerufen von Overview
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.
 
R

Rubberduck

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.

1586668014750.png
 
Hatsi09

Hatsi09

Warte mal, was genau ist die Funktion dieser Combobox, was willst du machen?
 
R

Rubberduck

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:
image.png
neu:
image.png

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:
image.png
Neu:
image.png

Liebe Grüsse
Rubberduck
 
Thema: 

Combobox-Werte in GUI anzeigen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben