`

JavaFX学习之Preloader

阅读更多
  JavaFX在Application加载的时候提供了Proloader应用,可以展现loading process bar或者others notification。

Main Application
package main;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import preloader.TestPreloader;

/**
 *
 * @author lq
 */
public class MainApplication extends Application {
	
    
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        
        Scene scene = new Scene(root, 300, 250);
        
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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


Preloader
package preloader;

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

/**
 * Simple Preloader Using the ProgressBar Control
 *
 * @author lq
 */
public class TestPreloader extends Preloader {
    
    ProgressBar bar;
    Stage stage;
    
    private Scene createPreloaderScene() {
        bar = new ProgressBar();
        BorderPane p = new BorderPane();
        p.setCenter(bar);
        return new Scene(p, 300, 150);        
    }
    @Override
    public void init(){
			System.out.println("preloader init");
    	
    }
    
    @Override
    public void start(Stage stage) throws Exception {
    	System.out.println("preloader start");
        this.stage = stage;
        stage.setScene(createPreloaderScene());        
        stage.show();
    }
    
    @Override
    public void handleStateChangeNotification(StateChangeNotification scn) {
        if (scn.getType() == StateChangeNotification.Type.BEFORE_START) {
            stage.hide();
        }
    }
    
    @Override
    public void handleProgressNotification(ProgressNotification pn) {
        bar.setProgress(pn.getProgress());
    }    
    
    public static void main(String args[]){
    	launch();
    }
}


若使用NetBeans,在构建Main Application时,便可以选着Preloader程序,运行时则只要运行Main程序即可。

若使用eclipse则需要使用Ant
<project name="TestPreloader" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">
	<target name="default">
		<taskdef resource="com/sun/javafx/tools/ant/antlib.xml" uri="javafx:com.sun.javafx.tools.ant" classpath=".:C:/Program Files/Java/jdk1.7.0_07/lib/ant-javafx.jar" />
		<fx:application id="app-desc" mainClass="main.MainApplication" preloaderClass="preloader.TestPreloader">
		</fx:application>
		<fx:jar destfile="dist/application.jar">
		    <fx:application refid="app-desc"/>
			<fileset dir="bin"/>
		</fx:jar>
        <java jar="dist/application.jar" fork='true'/>
	</target>
</project>

主要是fx:application,它会帮你把main和preloader联系起来,然后生成jar包。然后执行这个jar包就可以了(最后变成执行jar,这是自己想的,但总感觉和netBeans里有点不同).

Preloader有3个方法可以重载
public void handleStateChangeNotification(StateChangeNotification scn) 总共调用三次,在main启动load,init,start之前。
public void handleProgressNotification(ProgressNotification pn)       二次0和1,全在main load 之前。
public void handleApplicationNotification(PreloaderNotification info) 当main函数里面调用notifyPreloader时才调用。

有了2个stage,则之间通信,可以有2种情况:
一:通过handleStateChangeNotification(StateChangeNotification evt)    evt.getApplication获取main Application。一般都是preloader提供一个接口,main实现该接口,从而preloader通过接口可以获取main里面的内容。
二:PreloaderHandoverEvent实现preloaderNotification,然后main把node保存到PreloaderHandoverEvent类中,然后调用notifyPreloader方法,而preloader通过handleApplicationNotification(PreloaderNotification info)获取 final PreloaderHandoverEvent event = (PreloaderHandoverEvent)info;该实现类,然后获取node。

这里有很多javafx的小游戏,一个高手写的
http://lustrezhang.gotoip4.com/fxgame/

这里有个javafx学习的中文网站,我把内容都丢那上面去了。
http://www.jfxee.com/
  • 大小: 33.2 KB
分享到:
评论
1 楼 笑海人胜 2014-12-29  

相关推荐

Global site tag (gtag.js) - Google Analytics