JavaFX ChoiceBox selectFirst IndexOutOfBoundsException

godi

Aktives Mitglied
Hallo,

ich erstelle eine ObservableList die ich einer ChoiceBox übergebe. Wenn in die ObservableList ein Element eingefügt wird und in der ChoiceBox keines ausgewählt ist, dann soll automatisch das erste Element gewählt werden.

Folgend möchte / habe ich dies umgesetzt:
Java:
package application;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.ChoiceBox;
import javafx.scene.layout.BorderPane;

public class SelectDatabox extends Application {

    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            ChoiceBox<String> choiceBox = new ChoiceBox<>();
            root.setCenter(choiceBox);
            Scene scene = new Scene(root,400,400);
            primaryStage.setScene(scene);
            primaryStage.show();

            ObservableList<String> items = FXCollections.observableArrayList();
            choiceBox.setItems(items);

            choiceBox.getItems().addListener((ListChangeListener<String>)(c) -> {
                if ((choiceBox.getSelectionModel().getSelectedIndex() < 0) && (choiceBox.getItems().size() > 0)) {
                    choiceBox.getSelectionModel().selectFirst(); // TODO: There is a java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 ?
                }
            });

            items.add("Test");
            items.add("Test2");

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

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


Jedoch bekomme ich eine IndexOutOfBoundsException und ich verstehe es einfach nicht warum.
Weiß jemand warum die Exception ist, bzw wie ich es anders umsetzen kann?

godi
 

MichaProgs

Aktives Mitglied
Hi godi,

du übergibst die Daten der ObsList erst ganz am Schluss - also nachdem du das erste Item selektieren möchtest. Da die Liste zu diesem Zeitpunkt noch leer ist, kommt es zu der Exception. Adde die Items am besten direkt nachdem du die ObsList deklarierst, dann müsste es funktionieren.

Gruß
TB94
 

godi

Aktives Mitglied
Guten Morgen!

du übergibst die Daten der ObsList erst ganz am Schluss - also nachdem du das erste Item selektieren möchtest.

Ja die Daten werden der ObserverList erst zum Schluss übergeben, jedoch wird die .selectFirst() Methode auch erst aufgerufen wenn das erste Item hinzugefügt wird, da sich dieser Code in einem Listener befindet, der auf die ObservableList hört. Wenn man es debuggt, bzw die Objekte per Sysout in der Konsole ausgibt, dann sieht man auch, dass zum Zeitpunkt des Methodenaufrufes .selectFirst() sich mindestens ein Item in der ObservableList befindet. Weiters ist dies auch aus der if-Anweisung zu ekennen, da ich die Größe mit > 0 Abfrage.

godi
 

godi

Aktives Mitglied
Also bei mir klappt dein Code ohne Probleme

Welche Java Version hast du installiert?
Wie ich den Beitrag erstellt habe, hatte ich build 1.8.0_51 installiert gehabt, auf Windows und Ubuntu.
Jetzt habe ich unter Ubuntu 1.8.0_60 und damit Funktioniert es.
Unter Windows habe ich noch die alte Version, da kann ich dieses Problem rekonstruieren.

Also dürfte wieder ein Bug gewesen sein der mir dann Gesamt min 3h gekostet hat.

Danke für deinen Hinweis!
 

Ähnliche Java Themen

Neue Themen


Oben