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的小游戏,一个高手写的
[url]http://lustrezhang.gotoip4.com/fxgame/[/url]

这里有个javafx学习的中文网站,我把内容都丢那上面去了。
http://www.jfxee.com/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值