JavaFX. Ввод текста из файла в Combobox

Делаю приложение с возможностью выбора параметров из выпадающего списка. Список хочу вводить через файл "Input.txt". Использую следующий код:

private void setComboBox(ComboBox<String> list) throws FileNotFoundException {
        ArrayList<String> array = new ArrayList<>();

        FileReader file = new FileReader("src/main/java/com/example/test/Input.txt");

        Scanner scanner = new Scanner(file);
        while (scanner.hasNext())
            array.add(scanner.nextLine());
        listConsumer.getItems().addAll(array);
        System.out.println(listConsumer.getItems().size());

Код запускается без проблем, ошибок нет. Но выпадающий список в окне программы пустой. Данный кусок кода выводит правильное число строк в файле, значит он все считывает.

System.out.println(listConsumer.getItems().size());

В чем может быть проблема?


Ответы (1 шт):

Автор решения: Perfect Voyage

Я предоставлю минимально воспроизводимый пример по вашему коду. Все комментарии и пояснения указаны в коде. Должен быть :

  • класс Main откуда идёт запуск.

  • Класс контроллер (Читаем про MVC JFX )

  • FXML где прописан контроллер (id) и все элементы (поля) контроллера.

  • Ваш вспомогательный класс, где вы пытаетесь загрузить данные.

Можно конечно, подгружать NODE вне зависимости от контроллера, но для этого у вас должен быть объявлен хот бы один контейнер.

    public class Main extends Application {
    /*
    Стандартный пример генерируемый IDE, ничего необычного
     */

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }

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

}

/////

    public class Controller {

    @FXML
    private ComboBox<String> box;
    
    public void initialize() {
        try {
            new BoxClassOrg().setComboBox(box);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
}

/////

    <GridPane alignment="center" hgap="10" vgap="10"
          xmlns="http://javafx.com/javafx/8"
          xmlns:fx="http://javafx.com/fxml/1"
          fx:controller="sample.Controller">
   <children>
      <ComboBox fx:id="box" prefWidth="150.0" />
   </children>
</GridPane>

Какой бы у вас ни был FXML, в контроллере имя поля, всегда должно быть == fx:id !!!!!!!! Это связка

//// Ваш класс

    public class BoxClassOrg {
    public void setComboBox(ComboBox<String> list) throws IOException {

        // Если пробрасываете вверх FileNotFoundException
        // То не учитываете что может возникнуть IOException
        // Он выше по иерархии, ловит и то и другое.

        ArrayList<String> array = new ArrayList<>();
        FileReader file = new FileReader("src/main/java/com/example/test/Input.txt");

        Scanner scanner = new Scanner(file);
        while (scanner.hasNext()) {
            array.add(scanner.nextLine());
        } // нет границ цикла

        // listConsumer.getItems().addAll(array); // это откуда ?
       // System.out.println(listConsumer.getItems().size()); // кто такой этот ваш listConsumer

        list.setItems(FXCollections.observableArrayList(array));
        // Добавление в бокс
        // Рекомендую почитать про FXCollections
        // Большинство итемов в JFX связаны с ним.

        scanner.close(); // Закрывать не забываем
    }
}
   
→ Ссылка