第14章
JavaFX基础
JavaFX 是开发Java GUI程序的新框架。JavaFX平台取代了Swing和AWT,JavaFX可以作为一个应用独立运行或者在浏览器中运行。
JavaFX程序的基本结构
public class MyJavaFx extends public class MyJavaFx extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Button btnOK = new Button("OK");
Scene scene = new Scene(btnOK,200,200);
primaryStage.setTitle("mayjavafx");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
javafx.application.Application
定义编写JavaFX程序的基本框架,其静态方法launch()
方法用于启动一个独立的JavaFx
应用,当运行一个没有main
方法的JavaFx
应用,JVM
自动调用launch
方法以运行应用程序。
当一个JavaFx应用启动时,JVM创建一个Application类(子类)的实例并调用它的start()方法,一个称为主舞台的Stage对象由JVM自动创建。start()方法用于将UI组件放入一个场景,并且在舞台中显示该场景。舞台是一个支持场景的平台,结点如同在场景中演出的演员。一个JavaFx应用可以显示多个舞台。

面板、UI组件及形状
结点Node是一个形状Shape,一个ImageView、一个UI组件或者一个面板。
形状Shape是指文字、直线、圆Circle、椭圆、矩形、弧、多边形、折线等。
UI组件是标签、按钮、复选框、单选按钮、文本域、文本输入域等。
面板Pane是容器,可以包含Node的任何子类型。
Scene可以包含Control(UI组件的父类)或者Pane,但是不能包含Shape和ImageView
图形的尺寸单位都是是像素。
StackPane类似于FrameLayout.
属性绑定
可以将一个目标对象绑定到源对象中。源对象的修改将自动反应到目标对象中。
target.bind(source); target.bind(source); //单向绑定
bindBidirectional()方法 //双向绑定
bind方法在javafx.beans.property.Property接口中定义。
绑定属性是javafx.beans.property.Property的一个实例。源source是javafx.beans.value.ObervableValue接口的一个实例,允许值改变时被观察到。
数据类型 | 绑定属性类型 |
---|---|
double | DoubleProperty |
float | FloatProperty |
long | LongProperty |
int | IntegerProperty |
boolean | BooleanProperty |
String | StringProperty |
这些属性同时也是ObervableValue的子类型。
一般来说,JavaFX类(如Circle)的每个绑定属性(如centerX)都有一个获取方法和设置方法(如getCenter()和setCenter(double)).同时还有一个获取方法返回属性本身。
centerX的属性获取方法是centerXProperty()
getCenterX()称为值的获取方法,setCenterX(double)称为值的设置方法。
节点Node的通用属性和方法
抽象类Node定义了许多通用属性和方法。
JavaFx的样式属性类似于html的css。JavaFx的样式属性称为JavaFX CSS,使用前缀-fx-
进行定义。
//style属性
circle.setStyle("-fx-stroke: black; -fx-fill: red;-fx-background-color: gold");
//rotate属性
button.setRotate(80) //将按钮旋转80°
Node类包含了许多有用的方法,可以应用于所有节点。例如,使用contains(double x,double y)来检测一个点(x,y)是否位于一个节点的边界内。
Color类是抽象类Paint的子类,用于创建颜色,Paint用于绘制节点。
Font类描述字体、粗细和大小。
Image类表示一个图像,ImageView类用于显示一个图像。
布局面板
类 | 描述 |
---|---|
Pane | 布局面板的基类,有getChildren()返回面板中的节点列表 |
StackPane | 节点放置在面板中央,并叠加在其他节点上 |
FlowPane | 节点以水平方式一行一行放或者垂直方式一列一列放,类似于LinearLayout |
GridPane | 节点放置在一个二维网格的单元格中,可以指定节点在第几行第几列,设置对齐方式 |
BorderPane | 将节点放置在上下左右以及中间区域 |
HBox | 节点放在单行中 |
VBox | 节点放在单列中 |
Pane通常用于显示形状的画布。
每个面板包含一个列表用于容纳面板中的节点,列表是ObservableList的实例,可以通过getChildren()得到。
Label就是TextView,TextField就是EditText。
//设置内边距
pane.setPadding(new Insets(0,12,13,14));
//设置编辑框(文本域)的期望列数
TextField&setPrefColumnCount(int)
注:一个节点只能放在一个面板中,面板也是一个节点,因此可以放入另一个面板中
事件驱动编程和动画
引言
能对一个按钮动作事件进行处理的对象成为一个事件处理器,要成为一个动作事件的处理器,必须满足:
- 该对象必须是EventHandler
接口的一个实例 - EventHandler对象handler必须使用方法source.setOnAction(handler)和事件源对象注册。
例:2个按钮以及对他们点击事件的处理
package com.ustc.g_javafx;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class FX_15_1_HandleEvent extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
HBox layout = new HBox(10);
layout.setAlignment(Pos.CENTER);
Button btnOK = new Button("OK");
Button btnCancel = new Button("Cancel");
btnOK.setOnAction(new OKHandlerClass());
btnCancel.setOnAction(new CancelHandlerClass());
layout.getChildren().addAll(btnOK,btnCancel);
Scene scene = new Scene(layout);
primaryStage.setTitle("处理事件");
primaryStage.setScene(scene);
primaryStage.show();
}
class OKHandlerClass implements EventHandler<ActionEvent>{
@Override
public void handle(ActionEvent event) {
System.out.println("OK button clicked");
}
}
class CancelHandlerClass implements EventHandler<ActionEvent>{
@Override
public void handle(ActionEvent event) {
System.out.println("cancel button clicked");
}
}
}
- Java事件的根类的是java.util.EventObject,JavaFx事件的根类是javafx.event.Event
注册处理器和处理事件
JavaFX定义了一个对于事件T的统一的处理器(监听者)接口EventHandler
内部类和匿名内部类和lambda表达式
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!