Mon IDE est IntelliJ. J'ai essayé le document this pour apprendre le preloader mais pour une raison quelconque, le preloader n'est jamais appelé depuis ma classe principale, ou même ses méthodes sont appelées.JavaFX Preloader n'a jamais été appelé par le principal
Voici donc ma classe principale:
public class LongInitApp extends Application {
Stage stage;
BooleanProperty ready = new SimpleBooleanProperty(false);
private void longStart() {
//simulate long init in background
Task task = new Task<Void>() {
@Override
protected Void call() throws Exception {
int max = 10;
for (int i = 1; i <= max; i++) {
Thread.sleep(200);
notifyPreloader(new ProgressNotification(((double) i)/max));
}
ready.setValue(Boolean.TRUE);
notifyPreloader(new StateChangeNotification(
StateChangeNotification.Type.BEFORE_START));
return null;
}};
new Thread(task).start();
}
public static void main(String args[]) {
launch(args);
}
@Override
public void start(final Stage stage) throws Exception {
longStart();
stage.setScene(new Scene(new Label("Application started"),400, 400));
ready.addListener(new ChangeListener<Boolean>(){
public void changed(
ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
if (Boolean.TRUE.equals(t1)) {
Platform.runLater(new Runnable() {
public void run() {
stage.show();
}});}}});;}}
Et ma classe de préchargement:
public class LongAppInitPreloader extends Preloader {
ProgressBar bar;
Stage stage;
boolean noLoadingProgress = true;
private Scene createPreloaderScene() {
bar = new ProgressBar(0);
BorderPane p = new BorderPane();
p.setCenter(bar);
return new Scene(p, 300, 150);
}
public void start(Stage stage) throws Exception {
this.stage = stage;
stage.setScene(createPreloaderScene());
stage.show();
}
@Override
public void handleProgressNotification(ProgressNotification pn) {
if (pn.getProgress() != 1.0 || !noLoadingProgress) {
bar.setProgress(pn.getProgress()/2);
if (pn.getProgress() > 0) {
noLoadingProgress = false;
}
}
}
@Override
public void handleStateChangeNotification(StateChangeNotification evt) {
//ignore, hide after application signals it is ready
}
@Override
public void handleApplicationNotification(PreloaderNotification pn) {
if (pn instanceof ProgressNotification) {
double v = ((ProgressNotification) pn).getProgress();
if (!noLoadingProgress) {
v = 0.5 + v/2;
}
bar.setProgress(v);
} else if (pn instanceof StateChangeNotification) {
stage.hide();
}
}
}
Vous pouvez vérifier http://docs.oracle.com/javafx/2/deployment/preloaders.htm documents aussi. Ces codes appartiennent à l'exemple 9-11 et 9-12.
Où chargez-vous le «Preloader»? Jetez un oeil à https://stackoverflow.com/questions/43551620/javafx-preloader-thread/43554718#43554718 – jns
Comment exécutez-vous l'application? Il doit être empaqueté avec le préchargeur spécifié (ou utiliser des classes d'API non publiques pour le lancement, comme dans la question ci-dessus). Exécuter simplement la classe principale ici ne provoquera pas le chargement du préchargeur. –
Je pensais que je lancerais quand j'utiliser la méthode notifyPreloader. Je dois le lancer comme "LauncherImpl.launchApplication (App.class, TestPreloader.class, args);" ? –