第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应用可以显示多个舞台。

image-20201018224640388

面板、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");
        }
    }
}

image-20201019010038013

  • Java事件的根类的是java.util.EventObject,JavaFx事件的根类是javafx.event.Event

注册处理器和处理事件

JavaFX定义了一个对于事件T的统一的处理器(监听者)接口EventHandler ,该处理器接口包含handler(T e)方法用于处理时间。

内部类和匿名内部类和lambda表达式


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!