JavaFX基础
javaFX是学习面向对象编程的优秀教学工具
JavaFX与Swing以及AWT的比较
要点提示: JavaFX用于开发富因特网应用
富因特网应用是一种Web应用,可以表现一般桌面应用具有的特点和功能。JavaFX可以无缝地在桌面或者Web浏览器中运行。
JavaFX程序的基本结构
要点提示 : 抽象类 javafx . application . Application 定义编写 JavaFX 程序的基本框架 。
面板、UI组件以及形状
要点提示: 面板、UI组件以及形状是Node的子类型
(各个部分的包含情况)
属性绑定
要点提示: 可以将一个目标对象绑定到源对象中。源对象的修改将自动反应到目标对象中。
属性绑定: 将一个目标对象和一个源对象绑定。如果源对象中的值改变了,目标对象也将自动改变。目标对象称为绑定对象或者绑定属性,源对象称为可绑定对象或者可观察属性。
一个属性既可以作为目标,也可以作为源。目标监听源中的变换,一旦源中发生变化,目标将自动更新自身。
一个目标采用bind方法和源进行绑定,如下所示:
target.bind(source);
绑定的演示:
双向绑定
这样,一个属性的改变将反应到另一个对象上,反过来也一样,这样的绑定叫做双向绑定。如果目标和源同时是绑定属性和可观察熟悉你个,他们就可以使用bindBidirectional方法进行双向绑定。
节点的通用属性和方法
要点提示: 抽象类Node定义来许多对于节点而言通用的属性和方法
节点具有通用属性;
JavaFx的样式属性称为JavaFx CSS
设定样式的语法是styleName:value
一个节点的多个属性可以一起设置,通过分号(;)进行分隔。例如:
circle.setStyle(“-fx-stroke: black; -fx-fill: red”);
它等效于:
circle.setStyle(Color.Black);
circle.setFill(Color.Red);
如果使用了一个不正确的JavaFx CSS,程序依然可以编译和运行,但是样式会被忽略
rotate属性可以设定一个以度为单位的角度,让节点围绕它的中心旋转该角度。如果设置的角度是正的,表示顺时针旋转,否则是逆时针旋转
例如:将一个按钮旋转80度
button.setRotate(80);
Color类
要点提示: Color类可以用于创建颜色
JavaFx定义类抽象类Paint用于绘制节点。Javafx.scene.paint.Color是Paint的具体子类,用于封装颜色信息。具体如下:
可以通过一下构造方法创建颜色实例:
public Color(double r, double g, double b, double opacity);其中的每个double值的范围从0.0到1.0,由浅到深。opacity定义了一个颜色的透明度,也是从0.0到1.0,由完全透明到完全不透明。这称为RGB模型,A表示alpha值,是透明度的意思。
Color color = new Color(0.25, 0.14, 0.333, 0.51);
Color类是不可修改的。当一个Color对象创建后,它的属性就不能再修改。brighter()返回一个具有更大的红、绿、蓝值的新的Color对象,而darker()方法返回一个具有更小的对象,opacity值与原来的Color对象中的值相同。
采用静态方法color(r,g,b),color(r,g,b,opacity),rgb(r,g,b),rgb(r,g,b,opac ity)来创建一个颜色对象。
另外一种方法是: 可以采用Color类中定义的许多标准颜色之一,如BEIGE(米色),BLACK,BLUE,CYAN,DARKGRAY,GREEN,LIGHTGRAY,MAGENTA(品红),NAVY(海军蓝),ORANGE,PINK,SILVER,WHITE,YELLOW
Font类
要点提示: Font类描述字体名、粗细和大小
可以在渲染文字的时候设置字体信息。javafx.scene.text.Font类用于创建字体
Font类实例可以用它的静态方法或者哦构造方法来创建,Font可以用它的名字、粗细、字体形态和大小来描述。Times,Courier和Arial是字体名字的示例。可以通过调用静态方法getFamilies()获得一个可用的字体系列名字列表。List是一个为列表定义通用方法的接口。ArrayList是List的一个具体实现。
字体形态是两个常量:FontPosture.ITALTC(意大利文)和FONTPosture.REGULAR.下面语句生成两个字体。
Font font1 = new Font(“SansSerif”,16);
Font font2 = Font.font(“Times New Roman “,FontWeight.BOlD, FontPosture.ITALIC, 12)
StackPane将节点置于中央,节点依次位于最上面
Image和ImageView类
要点提示: Image类表示一个图像,ImageView用于显示一个图像。
javafx.scene.image.Image类表示一个图像,用于从一个特定的文件名或者一个URL载入一个图像。
javafx.scene.image.ImageView是一个用于显示图像的节点。ImageView可以从一个Image对象产生。例如:以下代码从一个图像文件创建一个ImageView:
Image image = new Image(“image/us.gif”);
ImageView imageView = new ImageView(image);
当然,也可以周姐从一个文件或者一个URL来创建一个ImageView
HOX是一种面板,他将所有的节点排列在水平的一行上。
seRoate方法在Node类中定义,可以用于任何节点。
Image对象可以被多个节点共享。
ImageView这样的节点是不能共享的。不能讲一个ImageView多次放入一个面板或者场景中。
注意,务必将图像文件放在类文件的相同个目录中。
如果使用URL来定位图像文件,必须提供URL协议http://
pane.setPadding(new Insets(5, 5 ,5, 5)); // 用于设置节点到边缘的距离
布局面板
要点提示: javafx提供了许多种类型的面板,用于自动地将节点布局在希望的位置和大小。面板的种类有下面这些。
Pane通常用作显示形状的画布。
Pane是所有特定面板的基类。
特定的面板StackPane。节点放置在StackPane面板的中央。
FlowPane
FlowPane 将节点按照加入的次序,从左到右或者从上到下垂直组织。当一行或者一列排满的时候,开始新的一行或者一列。可以使用下面两个常数中的一个来确定节点是水平还是垂直排列:
Orientation.HORIZONTAL 或者 Orientation.VERTICAL。(默认是水平的)可以使用像素为单位指定节点之间的距离。FlowPane的类图如图所示:
其中数据域alignment、oritentation、hap和vgap是绑定属性。JavaFX中的每个绑定属性都有一个获取方法,例如getHgap()返回其值,一个设置方法,如sethGap(double)设置一个值,以及一个获取方法返回属性本身,(如hGapProperty())。对于一个ObjectProperty
文本域这样的节点只能加到一个面板中一次。将一个节点加入到一个面板中多次或者不同面板中将引起运行时错误
一个节点只能放置在一个面板中。因此,面板和节点的关系是组合关系,使用一个填充的菱形表示。
GridPane
GridPane将节点布局在一个网络(矩阵)中。节点放在一个指定的列和行索引中。GridPane的类图如下:
注意
场景的大小没有设置时,场景会根据其中节点的大小自动计算。
BorderPane
BorderPane可以将节点放置在五个区域: 顶部、底部、左边、右边以及中间,分别使用:
setTop(node), setBottom(node),setLeft(node),setRight(node),setCenter(node)
注意
面板自己就是一个节点,所以面板可以加入到另一个面板中。
如果要将一个节点从顶部区域移除,调用setTop(null);
如果一个区域没有被占据,那么不会分配空间给这个区域
HBox和VBox
HBox将它的字节点布局在单个水平行中。VBox将它的节点布局在单个垂直列中。
和FlowPane想比,HBox和VBox只能将节点布局在一行或者一列中,而不是将它的额节点布局在多行或者多列中。
形状
JavaFx提供了多种形状类,用于绘制文本、直线、圆、矩形、椭圆、弧、多边形以及折线
Shape类是一个抽象基类,定义了所有形状的共有属性。这些属性有fill,stroke,strokeWidth。
fill指定一个填充形状内部区域的颜色
stroke指定用于绘制形状边缘的颜色。
strokeWidth指定形状边缘的宽度。
Text
Text类定义类一个节点,用于在一个起始点(x,y)处显示一个字符串。
Text对象通常置于一个面板中。
对于一个面板,左上角是(0,0),右下角是(pane.getWidth(),pane.getHeight())
一个字符串可以通过\n分隔从而显示在多行。
以下是Text的UML图:
Line
一条线通过4个参数(startX, startY, endX, endY)连接两个点。Line类的UML图:
Rectangle
一个矩形通过参数x, y, width, height, arcWidth以及arcHeight定义。
矩形的左上角处于(x,y),参数aw(arcWidth)表示圆角处弧的水平直径,ah(arcHeight)表示圆角处弧的垂直直径。Rectangle的UML图如下:
Circle和Ellipse(椭圆)
对于Ellipse,其中的radiusX值的是a,radiusY指的是b(椭圆数学定义中的a和b)
Arc
一段弧可以认为是椭圆的一部分,由参数centerX, centerY, radiusX, radiusY, startAngle, length以及一个弧的类型(ArcType.OPEN, ArcType.CHORD或者ArcType.ROUND)来确定。
其中startAngle是起始角度,length是跨度(即弧所覆盖的角度)。
角度使用度来作为单位,并且遵循通常的数学约定(即,0度是最东的方向,正的方向表示从最东方向开始顺时针方向的旋转角度)
单词解释: chord - 弦
不同类型弧长如下 :
角度可以是负数。一个负的起始角度从最东的方向顺时针旋转一个角度。一个负的跨度角度从起始角度开始顺时针旋转一个角度
(一句话总结: 这里的正负就和数学中一样)
Polygon(多边形)和polyline(折线)
Polygon类定义一个连接一个点序列的多边形,polyline类类似于Polygon类,不同之处是Polyline类不会自动闭合。分别如下图所示:
示例学习: ClockPane 类
要点提示: 学习开发一个类,在面板中显示一个始终
ClockPane的合约图如下
因为一分钟有60s,所以第二个指针的角度是:
second * (2*pi/60)
包含秒数的确切分钟数是(minute + second / 60)
因为一小时有60分,因此分针的角度是(minute + second / 60) * (2pi/60)
由于一个圆被分为12个小时,所以时针的角度是: (hour + minute / 60 + second / (60 + 60)) * (2pi/12)