Я разрабатываю приложение JavaFX, для которого требуются ресурсы, загружаемые из файла, прежде чем можно будет запустить основную стадию приложения. Мое решение для выполнения sh этой задачи состоит в том, чтобы использовать PreLoader, чтобы пользователь не мог взаимодействовать с приложением, пока ресурсы не были загружены (довольно стандартные вещи).
У меня есть класс, расширяющий PreLoader класс, который создает объект, который загружает файл .f xml, который отображает сцена PreLoader. Все работает хорошо, пока я не попытаюсь вставить код для загрузки файлов.
Я хочу сделать это одновременно, чтобы при загрузке файлов статус обновлялся на экране. Я изучил использование задач и форумов здесь, но ничто не помогло, так как я не знаю, где разместить код, где.
Расширение класса PreLoader:
public class SplashPreLoader extends Preloader {
private Stage stage;
private SplashScene loadScreen;
public void start(Stage stage) throws Exception {
SplashScene intro = new SplashScene();
this.loadScreen = intro;
this.stage = stage;
stage.setScene(new Scene(intro, 475, 425));
stage.initStyle(StageStyle.UNDECORATED);
stage.show();
}
@Override
public void handleProgressNotification(ProgressNotification pn) {
//bar.setProgress(pn.getProgress());
}
@Override
public void handleStateChangeNotification(StateChangeNotification evt) {
if (evt.getType() == StateChangeNotification.Type.BEFORE_LOAD) {
//loadScreen.setStatusMessage("Hello Mister");
}
if (evt.getType() == StateChangeNotification.Type.BEFORE_START) {
/* Task<Void> task = new Task<Void>() {
@Override
public Void call() {
updateMessage("this mesashlkjfhkjlsd");
return null ;
}
};
statusMessage.textProperty().bind(task.messageProperty());
task.messageProperty().addListener((obs, oldMessage, newMessage) -> loadScreen.setStatusMessage(newMessage));
Thread th = new Thread(task);
th.setDaemon(true);
th.start();*/
//loadScreen.loadWebDriver();
stage.hide();
}
}
Компонент сцены:
public class SplashScene extends StackPane {
@FXML public Label statusMessage;
public SplashScene() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("splash_scene.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
//statusMessage.setTextFill(Color.WHITE);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
public String getStatusMessage() { return statusMessageProperty().getValue(); }
public void setStatusMessage(String value) {
statusMessageProperty().set(value);
System.out.println("at hert");
}
public StringProperty statusMessageProperty() { return statusMessage.textProperty(); }
public void loadWebDriver() {
//This is the function that I want to call to load all the files.
}
statusMessage
- это метка, которую я хочу изменить по мере загрузки файлов. Я попытался поместить задачу (поток) в функцию loadWebDriver()
, в конце start()
и в предыдущем предложении if, но она не дает желаемых результатов.
Я тоже нахожу это странным, потому что когда я пробовал это без task
, у меня был код смены метки перед кодом загрузки файла, но они всегда выполнялись в обратном порядке.
Я чувствую, что это может помочь из документации, но это ничего не значит для меня .. Кто-нибудь знает, что это значит?
Обратите внимание, что предварительные загрузчики подчиняются тем же правилам, что и другие приложения JavaFX, включая правила потоков FX. В частности, конструктор класса и метод init () будут вызываться в потоке, отличном от FX, а start () будет выполняться в потоке приложения FX. Это также означает, что конструктор приложения / init () будет работать одновременно с preloader start ().
Нужно ли использовать метод init ()?