Экземпляр ChooseScheme
отличается от того, который используется с fxml (при условии, что для атрибута fx:controller
установлено соответствующее значение).
Вы всегда инициализируете ImageView
полей, но если экземпляр ChooseScheme
не используется с fxml, экземпляры никогда не добавляются в сцену.(Фактически экземпляры, созданные инициализатором, никогда не добавляются в сцену, но для контроллера, используемого с fxml, начальные значения заменяются во время загрузки.)
Инициализировать поля, которые являютсядолжен быть введен из fxml.Это просто исправляет NullPointerException
, который может быть выдан.
Использование класса Application
в качестве контроллера также не является хорошей идеей.
В зависимости от того, где вы хотите определить случайные изображения,вам нужно использовать один из представленных здесь подходов Передача параметров JavaFX FXML .
В качестве альтернативы вы можете сделать это с помощью метода initialize
контроллера.Этот метод запускается в течение load
после того, как все объекты были введены.
Пример
Класс контроллера
package mypackage;
...
public ChooseSchemeController {
private static final Random random = new Random();
private static final int TOTAL_SCHEME = 26; // you don't want to use a wrapper type here
@FXML
private ImageView scheme1;
@FXML
private void initialize() {
chooseRandomImage(scheme1);
}
private void chooseRandomImage(ImageView iv) {
int imageNumber = random.nextInt(TOTAL_SCHEME);
System.out.println(imageNumber);
Image schemeImage = new Image("GUIfiles/imgs/schemecard/val5/"+ imageNumber + ".jpg");
iv.setImage(schemeImage);
}
}
GUIFiles / ChooseScheme.fxml
<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="mypackage.ChooseSchemeController">
<children>
<ImageView fx:id="scheme1"/>
</children>
</VBox>