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 шт):
Я предоставлю минимально воспроизводимый пример по вашему коду. Все комментарии и пояснения указаны в коде. Должен быть :
класс 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(); // Закрывать не забываем
}
}