После обновления до 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();
}
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
в контроллере?)
Видеть
Заполнение ListView
Простой пример создания и заполнения ListView имен (Strings) показан здесь:
ObservableList<String> names = FXCollections.observableArrayList(
"Julia", "Ian", "Sue", "Matthew", "Hannah", "Stephan", "Denise");
ListView<String> listView = new ListView<String>(names);