0
votes

Remplir la Combobox de choix

Je ne suis qu'un débutant complet en matière de programmation ou de java. Donc, pour le début, mon plan était de créer une fenêtre utilisant JavaFX (combiné avec le générateur de scènes) où j'ai un bouton qui me mène à une autre fenêtre où j'ai une liste déroulante. J'ai cherché sur Google pendant des heures pour trouver un moyen de remplir cette liste déroulante de choix, mais toutes les solutions que j'ai trouvées ne fonctionnent pas pour moi. C'est pourquoi je pense que j'ai fait des erreurs ici et j'espère que vous pourrez m'aider d'une manière ou d'une autre. Ou à list, donnez-moi un indice sur ce que je devrais apprendre / lire pour arriver moi-même à la solution. Donc pour commencer, voici mon code main.java où je construis ma première étape.

main.java:

<ComboBox fx:id="chobo_Fisch" prefWidth="150.0"/>

Dans mon "Scene-Hauptmenu.fxml" tout ce qui compte, c'est le bouton qui me mène à ma deuxième fenêtre:

Scene-Hauptmenu.fxml:

public class MyController implements Initializable{
    private Node node;
    private Stage stage;
    private Scene scene;
    private FXMLLoader fxmlLoader;
    private Parent root;

    @FXML
    private Button btn_gefangen;

    @FXML
    private ComboBox<String> chobo_fisch; 

    @FXML
    private Button btn_gefangen_zurueck;

    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }

    public void gefangen(ActionEvent event) throws IOException{

        node = (Node) event.getSource();
        stage = (Stage) node.getScene().getWindow();
        scene = stage.getScene();

        fxmlLoader = new FXMLLoader (getClass().getResource("gefangen.fxml"));

        root = (Parent) fxmlLoader.load();
        scene.setRoot(root);
        stage.sizeToScene();
        stage.setTitle("Fische eintragen");          
    }


    public void gefangen_zurueck(ActionEvent event) throws IOException{
        node = (Node) event.getSource();
        stage = (Stage) node.getScene().getWindow();
        scene = stage.getScene();
        fxmlLoader = new FXMLLoader (getClass().getResource("Scene-Hauptmenu.fxml"));
        root = (Parent) fxmlLoader.load();
        scene.setRoot(root);
        stage.sizeToScene();
        stage.setTitle("Fishbase");     
    }   
}

Jusqu'à présent, tout fonctionne bien et je peux changer à ma deuxième fenêtre sans problème. Mais je pense que mon principal problème réside dans ma classe de contrôleur alors le voici.

MyController.java:

<Button id="btn_gefangen" fx:id="btn_gefangen" mnemonicParsing="false" onAction="#gefangen" text="Ich habe Fische gefangen!" GridPane.rowIndex="1" />

Le bouton "btn_gefangen" me conduit à cette autre fenêtre où j'ai la combobox avec le fx: id "chobo_fisch".

gefangen.fxml:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            Parent root= FXMLLoader.load(getClass().getResource("Scene-Hauptmenu.fxml"));
            primaryStage.setTitle("Fishbase");
            primaryStage.sizeToScene();
            primaryStage.setResizable(false);
            primaryStage.setScene(new Scene(root));
            primaryStage.show();

        } catch(Exception e) {
            e.printStackTrace();
        }       
    }

    public static void main(String[] args) {
        launch(args);
    }   
}

J'ai donc cherché sur Google pendant des heures mais je n'ai toujours pas trouvé de solution pour remplir la liste déroulante avec des choix qui fonctionnent avec mon code. Qu'ai-je fait de mal? Quelqu'un peut-il m'aider ici?

Meilleures salutations

Jannik


1 commentaires

Pourquoi ne déclarez-vous que des champs, pas des variables locales? Il est inutile de conserver des données dans des champs, s'il n'est pas nécessaire d'y accéder plus tard, en fait cela augmente l'empreinte de votre classe en plus de rendre certains objets indisponibles pour les déchets De plus, je recommande d'utiliser différentes classes de contrôleur pour différents fxml.L'approche du contrôleur spécifiant le contrôleur avec lequel les débutants commencent le plus souvent (fx: controller) entraîne la création d'une instance de contrôleur à chaque fois qu'un fxml est chargé.Aucun nœud de différents fxml n'est disponible.


4 Réponses :


1
votes

Je suis nouveau dans ce domaine, mais je pense que c'est à quoi cela devrait ressembler ou du moins se fermer si j'ai compris ce que vous vouliez. Exemple ci-dessous:

ComboBox stuff = new ComboBox <> (); stuff.getItems (). addAll ("1", "2", "5", "10");

Remarque: je suis nouveau dans stackoverflow.


0 commentaires

3
votes

J'ai trouvé trois variantes, en fonction de votre configuration:

1ère variante

<?import javafx.collections.FXCollections?>
<?import java.lang.String?>

(Soure: https://www.geeksforgeeks.org/javafx-combobox-with-examples/ )

2ème variante
<ComboBox fx:id="someName">
     <items>
         <FXCollections fx:factory="observableArrayList">
              <String fx:value="1"/>
              <String fx:value="2"/>
              <String fx:value="3"/>
              <String fx:value="4"/>
          </FXCollections>
      </items>
      <value>
           <String fx:value="1"/>
      </value>
</ComboBox>

Source: ( https://docs.oracle.com/javafx/2/ui_controls/combo-box.htm )

3e variante (pour FXML)

final ComboBox emailComboBox = new ComboBox();
emailComboBox.getItems().addAll(
            "jacob.smith@example.com",
            "isabella.johnson@example.com",
            "ethan.williams@example.com",
            "emma.jones@example.com",
            "michael.brown@example.com"  
        );


5 commentaires

Lorsque j'essaye votre 3ème variante, j'obtiens l'erreur suivante: Causée par: javafx.fxml.LoadException: FXCollections n'est pas un type valide. /D:/workspace/Fishbase/bin/application/gefangen.fxml:33


@ JannikVöhl Vous devez vous assurer d'inclure les instructions de traitement d'importation appropriées au début du fichier fxml: ( Le second peut déjà être couvert par une importation pour java.lang. * )


Oh mon ... Je pensais avoir déjà écrit la ligne d'importation pour cela, mais je ne l'ai pas fait. Je suis désolé, cela fonctionne parfaitement maintenant, merci beaucoup et désolé pour mes questions stupides!


Premièrement, il n'y a pas de questions stupides :) Deuxièmement, je suggérerais d'utiliser un bon IDE qui ajoute ces importations pour vous, comme IntelliJ Idea (Community Edition), Netbeans ou Eclipse. Tous sont gratuits.


J'utilise Eclipse, mais cela ne suggère pas d'importations sur des fichiers FXML, du moins pour moi pas: D



0
votes

Essayez ceci:

ObservableList<String> items = FXCollections.observableArrayList();
    items.add("a");
    items.add("b");
    chobo_fisch.getItems().addAll(items);


1 commentaires

Malheureusement, je n'obtiens qu'une exception java.lang.NullPointerException avec cela



0
votes

Votre combobox doit être rempli d'éléments (dans votre cas String):

    chobo_fisch.setCellFactory(obj -> new ChoboFischListCell());
    chobo_fisch.setButtonCell(new ChoboFischListCell());

Si vous utilisez une combobox d'un objet plus complexe, vous pouvez utiliser une cellfactory pour choisir la valeur qui est affiché:

    List<String> list = new ArrayList<String>();
    list.add("Item 1");
    list.add("Item 2");
    chobo_fisch.setItems(FXCollections.observableArrayList(list));

où ChoboFischListCell est une classe qui étend ListCell et où vous implémentez quel champ de votre objet doit être affiché.


0 commentaires