Проблемы с представлением списка после обновления до Java 8

1

После обновления до Java 8 у меня возникли проблемы с отображением содержимого списка

  public class TestController extends AnchorPane implements Initializable {

        @FXML
        private ListView<String> listView;

        @Override
        public void initialize(URL url, ResourceBundle rb) {

        }

        public void setApp() {
            setContent();
        }

        /**
         * Set content in list
         */
        private void setContent() {
            ObservableList<String> items = FXCollections.observableArrayList();
            items.add("1");
            items.add("2");


            listView.setItems(items);

        }
    }

С Java 7 это дает мне список со значениями. После обновления до java 8 он дает мне пустой фрейм.

Спасибо James_D, вот код, который вы просили

public void goToTest() {
            try {
                TestController test = (TestController) replaceSceneContent("/fxml/test.fxml");
                test.setApp();

            } catch (Exception ex) {
                System.out.println("Error loading: " + ex + " - " + ex.getMessage());
            }
        }

     private Initializable replaceSceneContent(String fxml) throws Exception {
            FXMLLoader loader = new FXMLLoader();
            InputStream in = MainApp.class.getResourceAsStream(fxml);
            loader.setBuilderFactory(new JavaFXBuilderFactory());
            loader.setLocation(MainApp.class.getResource(fxml));
            AnchorPane page;
            try {
                page = (AnchorPane) loader.load(in);
            } finally {
                in.close();
            }

            Scene scene = new Scene(page);
            stage.setScene(scene);
            stage.sizeToScene();
            stage.setResizable(resizable);
            return (Initializable) loader.getController();
        }
  • 0
    Да, setApp вызывается из другого класса, который загружает fxml
  • 0
    Если я удаляю listView.setItems (items); я также получаю пустую рамку. Может быть проблема с FXMLLoader и инициализация listView ... Когда я делаю System.out.println ("listView.getitems is:" + listView.getItems (). Size ()); он показывает, что он получил содержимое, но не отображает в графическом интерфейсе, только пустой кадр
Показать ещё 2 комментария
Теги:
java-8
javafx
javafx-8
listview

2 ответа

2
listView = new ListView<>(items);

не будет работать; он создаст новый ListView и заполнит его, в то время как то, что вы хотите сделать, - это заполнить ListView, созданный в вашем FXML.

listView.setItems(items);

это правильный код.

(Я предполагаю, что у вас действительно есть public class TestController implements Initializable, а не public class test implements Initializable.)

Таким образом, следующее должно работать:

private void setContent() {
    ObservableList<String> items = FXCollections.observableArrayList();
    items.add("1");
    items.add("2");

    listView.setItems(items);

}

Ваш код FXMLLoader немного необычен тем, что вы устанавливаете местоположение (URL), а затем используете load(InputStream) для загрузки. Я был бы удивлен, если бы это исправлено, но обычным способом было бы:

    private Initializable replaceSceneContent(String fxml) throws Exception {
            FXMLLoader loader = new FXMLLoader();
            // not needed:
            // InputStream in = MainApp.class.getResourceAsStream(fxml);

            // Not really needed, this is the default:
            loader.setBuilderFactory(new JavaFXBuilderFactory());
            loader.setLocation(MainApp.class.getResource(fxml));
            AnchorPane page;

            // instead of this:
//            try {
//                page = (AnchorPane) loader.load(in);
//            } finally {
//                in.close();
//            }

            // just this (since you have set the location):
            page = loader.load();

            Scene scene = new Scene(page);
            stage.setScene(scene);
            stage.sizeToScene();
            stage.setResizable(resizable);
            return (Initializable) loader.getController();
        }

(Случайное предположение: случайно ли вы сделали static listView в контроллере?)

0

Видеть

Заполнение ListView

Простой пример создания и заполнения ListView имен (Strings) показан здесь:

 ObservableList<String> names = FXCollections.observableArrayList(
          "Julia", "Ian", "Sue", "Matthew", "Hannah", "Stephan", "Denise");
 ListView<String> listView = new ListView<String>(names);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню