当前位置: 首页 > 知识库问答 >
问题:

JavaFX预加载程序线程

苏波涛
2023-03-14
public void init(){
    System.out.println("Thread Preloader ID:"+ Thread.currentThread().getId());
    System.out.println("  ------  ");

    Pane effectRegion = LoaderFrame.getInstance().getEffectPane();
    JFXFillTransition fill = new JFXFillTransition();
    fill.setDuration(Duration.millis(400));
    fill.setRegion(effectRegion);
    fill.setAutoReverse(true);
    fill.setCycleCount(Animation.INDEFINITE);
    fill.setFromValue(Color.WHITE);
    fill.setToValue(Color.rgb(0,77,147));

    fill.play();

}

@Override
public void start(Stage primaryStage){
    System.out.println("Thread Preloader(start) ID:"+ Thread.currentThread().getId());
    System.out.println("  ------  ");
    LoaderFrame.getInstance().show();

}
public class LoaderFrame extends Stage {
public static LoaderFrame getInstance(){
    return instance;
}


private Scene scene;
private AnchorPane root;
private BorderPane wraper;
private StackPane effectPane;

private JFXButton loaderPathButton;


public LoaderFrame(){
    initScene();
    this.initStyle(StageStyle.TRANSPARENT);
    this.getIcons().add(new Image("file:imgs/favico/icon48.png"));
}

public void initScene(){
    FXMLLoader loader = new FXMLLoader(Main.class.getResource("xml/loader_frame.fxml"));
    root = null;

    try {
        root = loader.load();
        wraper = (BorderPane) root.lookup("#rootPane");
        loaderPathButton = (JFXButton) root.lookup("#loaderPathButton");
        effectPane = (StackPane) root.lookup("#effectPane");
        scene = new Scene(root);
        scene.setFill(Color.TRANSPARENT);
        scene.getStylesheets().add("file:css/loader.css");
        this.setScene(scene);
    } catch (IOException e) {
        e.printStackTrace();
    }

}


public Pane getEffectPane(){
    return effectPane;
}

}

共有1个答案

荣晨朗
2023-03-14

要研究preloader生命周期,可以将以下行添加到preloader类中:

    @Override
    public void handleStateChangeNotification(StateChangeNotification info) {
        System.out.println("state: " + info.getType());
    }

应用程序类中,可以在init/start方法中添加system.out.prinln消息。这将显示preloader通过其不同状态运行:before_loadbefore_initbefore_start

JavaFXThread调用preloaders start方法时,必须将对thread.sleep的调用封装在platform.runlater中。

public class App extends Application {

    private static final int PRELOADER_SHOWTIME_MILLIS = 2000;

    @Override
    public void init() throws Exception {
        long start = System.currentTimeMillis();

        // time consuming initializations

        long duration = System.currentTimeMillis() - start;
        long remainingShowTime = PRELOADER_SHOWTIME_MILLIS - duration;

        if(remaingShowTime > 0 ){
            Thread.sleep(remainingShowTime);
        }
    }

    @Override
    public void start(Stage primaryStage) {
        StackPane root = new StackPane(new Label("application"));
        Scene scene = new Scene(root, 400, 400);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

public class TestPreloader extends Preloader {

    private Stage stage;  

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

        Rectangle rect = new Rectangle(200, 200, Color.RED);
        FadeTransition transition = new FadeTransition(Duration.seconds(2), rect);
        transition.setFromValue(0);
        transition.setToValue(1);

        Label lbl = new Label("preloader");
        StackPane root = new StackPane(rect, lbl);

        primaryStage.setScene(new Scene(root));
        primaryStage.show();

        transition.play();
    }

    @Override
    public void handleStateChangeNotification(StateChangeNotification info) {
        if (info.getType() == Type.BEFORE_START) {
           stage.hide();
        }
     }

}

public class Main {

    public static void main(String[] args) {
        LauncherImpl.launchApplication(App.class, TestPreloader.class, args);
    }

}
 类似资料:
  • 我的IDE是Intellij。我尝试了这个文档来学习预加载器,但由于某些原因,预加载器从来没有从我的主类中调用过,甚至它的方法也没有被调用过。

  • 问题内容: 在Java 8中,我可以使用以下方法使用预加载器启动JavaFX应用程序: 我更喜欢从上面的代码开始,而不是使用部署配置,因为我不希望图形界面在每次启动应用程序时都启动,而只是在一些计算出应用程序应该在其中运行的代码之后才启动GUI模式。 我使用的是“ com.sun.javafx.application.LauncherImpl”类,但显然在Java 9中,所有以“ com.sun”

  • 我原以为这是一个简单的问题,但我很难找到答案。我有一个与JavaFX场景对象关联的ImageView对象,我想从磁盘加载大图像,并使用ImageView一个接一个地显示它们。我一直在努力寻找一种好方法来反复检查图像对象,当它在后台加载完成时,将其设置为ImageView,然后开始加载新的图像对象。我提出的代码(如下)有时有效,有时无效。我很确定我在JavaFX和线程方面遇到了问题。它有时加载第一个

  • testFX。java: testFXController.java: 测验fxml: 当我运行testFX. java时,系统打印: 这是教授的代码,我似乎无法运行它。我意识到主要问题在代码

  • 我试图使用neo4j中的命令从CSV文件中导入大约500,000行数据。 下面是我正在使用的代码: 期望的行为:第一次出现以另一个艺术家为特征的人会创建关系,并且应该将关系的属性设置为1。对于随后的每一次事件,强度属性将增加1。因此,经常以艺术家B为特色的艺术家A应该具有类似的关系 关系是方向性的,在这种情况下,方向性很重要(A以B为特征不同于B以A为特征)。 在确定问题时,是否有其他有用的信息?

  • 在JavaFX中,我使用stage1从一个阶段切换到另一个阶段。隐藏();第二阶段。show(); 然而,第二阶段相当大,包含了一大堆元素。所以当我显示()它时,当它第一次弹出时,有一段400毫秒的时间,整个阶段是空的和灰色的。然后所有的元素都出现了。 太难看了。这是在i7上,有一个非常好的图形处理器。 我已经注意到,如果我展示它,然后隐藏它,然后再次展示它,最终的节目从它出现在屏幕上的那一刻起就