почему setImage () не меняет мой ImgView в JavaFx? - PullRequest
0 голосов
/ 11 июня 2018
import javafx.application.Application;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.TilePane;
import javafx.stage.Stage;

public class ChooseScheme extends Application{

    GUIBoard board = new GUIBoard();
    Stage primaryStage;
    Integer totalScheme = 26;

//these are the imgs I want to change, in the fxml file they have their own path but with the method chooseRandomImgs(), 

    @FXML
    ImageView scheme1 = new ImageView();

    @FXML
    ImageView scheme2 = new ImageView();

    @FXML
    ImageView scheme3 = new ImageView();

    @FXML
    ImageView scheme4 = new ImageView();

    public void launchChooseScheme() throws Exception {

        start(new Stage());
    }

//standard method, it runs and open the scene

    @Override
    public void start(Stage primaryStage) throws Exception {

        this.primaryStage = primaryStage;
        Parent ChooseScheme;
        ChooseScheme = FXMLLoader.load(getClass().getClassLoader().getResource("GUIFiles/ChooseScheme.fxml"));

        Stage stage = new Stage();

        chooseRandomImgs();

        stage.setTitle("Choose Scheme");
        stage.setScene(new Scene(sgChooseScheme, 600, 400));
        stage.show();

    }

//this method should change my img

    private void chooseRandomImgs() {
        int countImages = totalScheme;
        int imageNumber = (int) (Math.random() * countImages);

        System.out.println(imageNumber);
        Image schemeImage = new Image("GUIfiles/imgs/schemecard/val5/"+ imageNumber + ".jpg");

        scheme1.setImage(schemeImage);
    }
}

Путь Img правильный.Когда я запускаю, класс не меняет ImgView scheme1;вместо этого он остается Img, который я установил в SceneBuilder, каждый раз, когда я запускаю код, он никогда не показывает новый Img.Я не понимаю почему.

1 Ответ

0 голосов
/ 11 июня 2018

Экземпляр 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>
...