相关文章: [在JavaFX使用多维数组 ] [自己编程写的JavaFX 演示游戏 ] [JavaFX和Java之间的互操作性 ] [JavaFX的Effect功能例子:编写许愿树程序(2) ] [JavaFX的Effect功能例子:编写许愿树程序(3) ]
本文着重介绍了用JavaFX的effect功能来实现用户图形界面(GUI)。
看了同事用NetBeans来开发PHP的许愿树程序(C/S架构的),其中client端的图形界面是由flash来实现。那么如果这个界面用JavaFX来写会怎样呢?我想这一定是很有趣的事情,于是就决定动手写个程序,比较一下。
我们首先写个主程序,把画面的Scene做出来。在这个画面中,蓝天背景和白云都需要使用图形效果(effect),在JavaFX中支持了多种图形效果,Lighting,Blur,Shadow等等,可以大大丰富我们的用户界面。我们的程序采用线性渐变(LinearGradient)效果来画蓝天,用高斯模糊(GaussianBlur)效果来画白云,程序如下:
/*
* Main.fx
*
* http://www.javafxblogs.com
*
*/
package wishtree;
import javafx.scene.effect.GaussianBlur;
import javafx.scene.effect.PerspectiveTransform;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.Scene;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
/**
* @author Henry Zhang
* JavaFX编程 http://javafxguy.iteye.com
* JavaFX技术交流应用 http://www.javafxblogs.com
*/
var xx = 170;
var yy = 430;
var tree : ImageView = ImageView {
x: 80
y: 0
image: Image {
url: "{__DIR__}images/tree.png"
width: 640
preserveRatio: true
}
};
var tree2 =
Image {
url: "{__DIR__}images/tree2.png"
width: 130
preserveRatio: true
};
var stage =
Stage {
title: "Wish Tree"
width: 830
height: 620
resizable: false
scene: Scene {
fill: LinearGradient {
startX: 0,
startY: 0.0,
endX: 0,
endY: 1.0
proportional: true
stops: [ Stop { offset: 0.0 color: Color.web("#14acf8") },
Stop { offset: 1.0 color: Color.web("#a4e6f8") }]
}
content: [
ImageView {
x: 50
y: 280
image: Image {
url: "{__DIR__}images/cloud2.png"
preserveRatio: true
width: 160
}
effect: GaussianBlur { radius: 25 }
},
ImageView {
x: 520
y: 300
image: Image {
url: "{__DIR__}images/cloud2.png"
preserveRatio: true
width: 150
}
effect: GaussianBlur { radius: 33 }
}, ( JavaFX Demo Game http://www.javafxgame.com )
ImageView {
x: 560
y: 500
image: tree2
},
ImageView {
x: 460
y: 470
image: tree2
},
ImageView {
x: 60
y: 500
image: tree2
},
ImageView {
x: 190
y: 470
image: tree2
},
tree,
ImageView {
x: 120
y: 360
image: Image {
url: "{__DIR__}images/sign.png"
width: 180
preserveRatio: true
}
},
ImageView {
x: 20
y: 60
image: Image {
url: "{__DIR__}images/cloud2.png"
preserveRatio: true
width: 250
}
effect: GaussianBlur { radius: 40 }
},
ImageView {
x: 520
y: 90
image: Image {
url: "{__DIR__}images/cloud2.png"
preserveRatio: true
width: 100
}
effect: GaussianBlur { radius: 20}
},
ImageView {
x: 620
y: 190
image: Image {
url: "{__DIR__}images/cloud2.png"
preserveRatio: true
width: 180
}
effect: GaussianBlur { radius: 25}
},
ImageView {
x: 600
y: 380
image: Image {
url: "{__DIR__}images/cloud2.png"
preserveRatio: true
width: 150
}
effect: GaussianBlur { radius: 33 }
},
ImageView {
x: 0
y: 490
image: Image {
url: "{__DIR__}images/cloud.png"
}
effect: GaussianBlur { radius: 30 }
},
Text {
x:170
y: 450
content: "许愿树"
fill: Color.YELLOW
font: Font.font ( null, FontWeight.BOLD, 30);
effect: PerspectiveTransform {
ulx: xx uly: yy
urx: xx+80 ury: yy-10
llx: xx-2 lly: yy+40
lrx: xx+80 lry: yy+38
}
}
]
}
}
在程序中,我们把Stage的scene属性用渐变效果填充,可以得到蓝天的效果。在这个渐变效果中,startX和endX的值一样,startY和endY的值不同,因此是沿着Y方向(竖直)的渐变方式。起始颜色为深蓝("#14acf8"),结束颜色为浅蓝("#a4e6f8"),在整个Stage的Y方向均匀变化,相关代码如下:(作者:Henry Zhang 发表于:http://javafxguy.iteye.com)
fill: LinearGradient {
startX: 0
startY: 0
endX: 0
endY: 1.0
proportional: true
stops: [ Stop { offset: 0.0 color: Color.web("#14acf8") },
Stop { offset: 1.0 color: Color.web("#a4e6f8") }]
}
白云的模糊效果是通过高斯算法来获取,例如在下面代码中,ImageView的effect属性是: GaussianBlur{ radius: 40 },radius表示模糊渐变发范围的大小,数值越大,模糊度越大。
ImageView {
x: 20
y: 60
image: Image {
url: "{__DIR__}images/cloud2.png"
preserveRatio: true
width: 250
}
effect: GaussianBlur { radius: 40 }
}
由于我们需要显示几朵不同大小的白云,我们需要把白云Image(cloud2.png)作大小调整,上面码中,我们通过改变width的值,并设置preserveRatio=true来保证长宽比例不变,这样就“创造”出不同大小的云块。相关代码段如下:
(本文参见:JavaFX许愿树 http://www.javafxblogs.com/javafx-effect-wish/)
preserveRatio: true
width: 250
还有要说明的一点是,在木牌子上的“许愿树”3个字,我们采用了维度变换( PerspectiveTransform )的效果,可以把2维的文字变成具有3维感觉的字形,呈梯形状。在PerspectiveTransform需要定义梯形的4个角的坐标,从而把原来长方形的区域映射成变形的字体。相关代码如下: (作者:Henry Zhang 发表于:http://javafxguy.iteye.com)
Text {
x:170
y: 450
content: "许愿树"
fill: Color.YELLOW
font: Font.font ( null, FontWeight.BOLD, 30);
effect: PerspectiveTransform {
ulx: xx uly: yy
urx: xx+80 ury: yy-10
llx: xx-2 lly: yy+40
lrx: xx+80 lry: yy+38
}
}
好了,许愿树程序的界面就完成了,在下一篇文章中会继续介绍如何在树上“挂上”愿望星星。如果你有JDK 1.5以上的环境(JDK1.6 U10以上更佳),快点击下图来看看这个JavaFX版本的“愿望树”吧。当你的浏览器首次运行JavaFX程序时,会有一些等待下载的时间。
本文同步发表于:JavaFX编程应用:许愿树
( 未完待续, 下一篇: 用JavaFX的Effect功能编写许愿树程序(2) )
Hobby Master 飞机 坦克 军事 模型 JavaFX例子和实例 JavaFX培训教程