如何在JavaFX中创建自定义加载屏幕?

Dav*_*lle 7 javafx

我想为JavaFX应用程序创建一个自定义加载屏幕.不希望用户看到Java咖啡杯图标,我想在那里放置我自己的图形!

我已经发现了如何提供静态图像,甚至是动画GIF,但我对类似Flash的屏幕更感兴趣,我可以指定图像的状态在某些百分比下的样子.

有任何想法吗?

Bri*_*ski 5

对于 JavaFX2,您可以设置自定义预加载器。您可以完全控制当时的场景。我个人没有使用过它们,但这可能就是您想要的。 http://docs.oracle.com/javafx/2/deployment/preloaders.htm


Rem*_*dar 1

JavaFX 预加载器类

我使用本机 JavaFX API 创建了一个非常简单的预加载器屏幕。这里解释了如何做到这一点: https: //docs.oracle.com/javafx/2/deployment/preloaders.htm(旧但可行的示例)-这是较新的并且似乎是相同的:https://docs。 oracle.com/javase/8/docs/technotes/guides/deploy/preloaders.html(较新的页面和JavaFX版本,但我没有看到区别)。

由于页面格式的原因,较旧的链接更易于阅读。

主班

package YOUR_PACKAGE_NAME;

import javafx.application.Application;

/**
 * Minimal reproducible example (MRE) - Example of a simple JavaFX preloader.
 * Java Main class for starting up the JavaFX application with a call to launch MainApplication.
 * @author Remzi Cavdar - ict@remzi.info - <a href="https://github.com/Remzi1993">@Remzi1993</a>
 */
public class Main {
    public static void main(String[] args) {
        /*
         * The following Java system property is important for JavaFX to recognize your custom preloader class.
         * Which should extend javafx.application.Preloader.
         */
        System.setProperty("javafx.preloader", Preloader.class.getName());
        // Launch the main JavaFX application class.
        Application.launch(MainApplication.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

预加载类

package YOUR_PACKAGE_NAME;

import javafx.scene.Scene;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

/**
 * Minimal reproducible example (MRE) - Example of a simple JavaFX preloader class.
 * @author Remzi Cavdar - ict@remzi.info - <a href="https://github.com/Remzi1993">@Remzi1993</a>
 */
public class Preloader extends javafx.application.Preloader {
    private ProgressBar progressBar;
    private Stage stage;

    private Scene createPreloaderScene() {
        progressBar = new ProgressBar();
        BorderPane borderPane = new BorderPane();
        borderPane.setCenter(progressBar);
        return new Scene(borderPane, 800, 600);
    }

    @Override
    public void start(Stage stage) throws Exception {
        this.stage = stage;
        // I also recommend to set app icon: stage.getIcons().add();
        stage.setTitle("YOUR TILE HERE");
        stage.setScene(createPreloaderScene());
        stage.show();
    }

    @Override
    public void handleProgressNotification(ProgressNotification pn) {
        progressBar.setProgress(pn.getProgress());
    }

    @Override
    public void handleStateChangeNotification(StateChangeNotification evt) {
        if (evt.getType() == StateChangeNotification.Type.BEFORE_START) {
            stage.hide();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试

  • 测试日期:2022 年 1 月 11 日
  • 测试的操作系统:Windows 11 - 版本 21H2(操作系统内部版本 22000.1098)
  • 测试环境:OpenJDK 19 - Eclipse Temurin JDK with Hotspot 19.0.1+10 (x64)(参见: https: //adoptium.net/en-GB/temurin/releases/? version=19 )
  • 使用 JavaFX (OpenJFX) 版本进行测试:OpenJFX 19(请参阅: https: //openjfx.io和存储库: https: //github.com/openjdk/jfx