前言
继续JavaFX的学习,本章主要是JavaFX 程序设计基础知识和实现一个base64加密解密的小工具。
一、基础知识
1)JavaFX 应用程序是一个继承了 javafx.application. Application 的 Java 类,Application 类负责管理 JavaFX 应用程序的生命周期。生命周期包括以下步骤:
-
创建 Application 类的一个实例。
-
调用 init 方法。
init 方法的默认实现不做任何事情,可以通过覆盖 init 方法,在应用程序的用户界面显示之前执行你想要的任何处理。
-
调用 start 方法。
start 方法是一个抽象方法,这意味着 Application 类没有提供默认实现。因此,你必须提供自己的 start方法版本。start 方法负责构建和显示用户界面。
-
等待应用程序结束,这通常发生在用户通过关闭主应用程序窗口或选择程序的退出命令来指示程序结束时。
在此期间,应用程序并不是真正空闲的。相反,它忙于响应用户事件,例如单击按钮或从下拉列表中选择。
-
调用 stop 方法。
与init 方法一样,stop 方法的默认实现没有任何操作。你可以通过覆盖它,以实现在程序结束时执行一些必要的处理,例如关闭数据库或是保存文件。
2)main 方法只包含一条语句,即对 Application 类的 launch 方法的调用。launch 方法是启动 JavaFX 应用程序的方法,它创建了一个 Application 类实例,然后启动 JavaFX 生命周期,调用 init 和 start 方法,等待应用程序完成,再调用 stop 方法。
public static void main(String[] args) {
launch(args);
}
}
3)每个 JavaFX 应用程序都必须包含一个 start 方法。在 start 方法中,你可以编写代码创建与用户进行交互的界面元素。当 JavaFX 应用程序启动时,JavaFX 框架会在 Application 类初始化之后调用 start 方法。
4)SceneBuilder中的TextField和TextArea在Controller中可以使用getText() 方法从用户那里接收文本输入的功能。单行文本可以使用TextField(),多行文本可以使用TextArea()。
5)要显示文本,可以调用 setText 方法,并将要显示的文本作为字符串进行传递,如:
setText("Click me please!");
6)用户单击按钮时,会触发一个活动事件。你的程序可以通过提供一个事件处理程序来响应事件。
7)处理 JavaFX 事件必须采取的三个步骤:
- 创建事件源
事件源只是一个可以生成事件的控件,例如按钮。通常,您将引用事件源的变量声明为私有类字段,在 start 方法或任何其他类方法之外:
- 创建一个事件处理程序
要创建事件处理程序,必须创建一个实现 EventHandler 接口并提供 handle 方法实现的对象。
以下是创建事件处理程序的四种方法:
- 将implements EventHandler 添加到程序的Application 类中,并提供handle 方法的实现。
- 在Application 类中创建一个实现 EventHandler 的内部类。
- 创建一个实现 EventHandler 的匿名类。
- 使用Lambda 表达式来实现句柄方法。
- 向事件源注册事件处理程序。
向事件源注册事件处理程序,以便在事件发生时调用handle 方法。每个充当事件源的组件都提供了一种方法,可让您注册事件处理程序以侦听事件。例如,Button 控件提供了一个 setOnAction 方法,可让您为操作事件注册一个事件处理程序。在 setOnAction 方法中,您将事件处理程序对象指定为参数。
8)JavaFX 总共提供了 8 种不同类型的布局面板,都是由 javafx.scene.layout 包中类定义的。
9)BorderPane布局会分为五个区域,上下左右中,在代码里分别对应五个方法,BorderPane 类非常适合:在顶部有菜单和工具栏,在底部有状态栏,可选任务面板或工具栏在左边或右边,主工作区域在屏幕中央,这种的布局。
BorderPane root = new BorderPane();
root.setTop(new Label("Top"));
root.setLeft(new Label("Left"));
root.setRight(new Label("Right"));
root.setBottom(new Label("Bottom"));
root.setCenter(new Label("Center"));
10)HBox水平布局,将组件按水平方向依次排列。VBox垂直布局,将组件按竖直方向依次排列。
11)创建边界面板的代码是:
BorderPane pane = new BorderPane();
pane.setCenter(btn);
这里,声明了一个名为 pane 的 BorderPane 类型的变量,并调用 BorderPane 构造函数创建了一个新的 BorderPane 对象。然后,使用 setCenter 方法将按钮(btn)显示在面板的中心区域。
12)创建完要显示的控件元素的面板后,应创建一个用于显示布局面板的场景(scene),场景(scene)就是应用程序所有要显示的节点(控件和布局面板)。可以用一行代码声明 Scene 类型的变量并调用它的构造函数来完成此操作。
Scene scene = new Scene(root, 300, 250);
- 第一个参数为:root是场景中显示的根节点
- 第二个参数为:300是场景的宽度(以像素为单位)
- 第三个参数为:275是场景高度(以像素为单位)
- 注意:如果省略宽度和高度,将根据根节点中包含的元素的大小自动调整场景的大小。
13)舞台(stage )就是显示场景的窗口。当 JavaFX 框架调用应用程序的 start 方法时,会通过 primaryStage 参数传递一个 Stage 类的实例,其表示应用程序的主舞台 —— 即应用程序主窗口的舞台。
创建主舞台需要做两件事:
- 调用主舞台的 setScene 方法来设置要显示的场景
- 调用主舞台的 show 方法来显示场景
primaryStage.setScene(scene);
primaryStage.show();
14)程序运行流程:
- 运行程序,先调用main方法
- main方法调用Application类中的launch方法
- launch方法将创建Application类的一个实例,然后调用 start 方法
- start 方法接受一个参数:Stage 对象,应用程序的用户界面将在其上进行显示
- 加载到sample.fxml文件内容
- sample.fxml文件又调用执行到Controller文件中最后执行stop方法结束程序
二、Base64编码解码小工具
1)本文由于使用的是家里的电脑所以IDEA版本和JavaFX笔记(一)不同为:2021.1版本,SceneBuilder为2.0版本,不同版本创建可能有些区别。
2)选择sample.fxml文件,右键打开SceneBuilder工具。
3)选择AnchorPane锚布局方式,点击右键拖拽到中间就可以了。
4)选择控件中的button按钮,拖拽两个,点击按钮分别改名为Base64加密,Base64解密。
5)点击按钮在On Action处分别写上加密解密的英文,此处随意。
6)选择控件中的TextArea文本域,拖拽两个对其,然后点击在fx:id处分别写上text1和text2。
7)然后点击 file 选择 save 保存,会发现sample.fxml文件已经发生变化。点击View,选择最下边的即可查看当前布局的代码。
8)把代码复制粘贴到Controller文件中,有报错的就改改,缺包的就导入包。
9)sample.fxml文件中需要添加fx:controller=“sample.Controller”,指向控制器文件,然后再Controller文件中写逻辑代码。
10)Controller文件中代码。
package sample;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.TextArea;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
public class Controller {
@FXML
private TextArea text1;
@FXML
private TextArea text2;
@FXML
void encryption(ActionEvent event) {
// 文本1中使用gettext方法 获取用户输入的数据
String text = text1.getText();
// 创建变量encoder 在堆中开辟一块空间
BASE64Encoder encoder = new BASE64Encoder();
// 调用加密的方法
String data = encoder.encode(text.getBytes());
// 加密后的数据显示在文本2里
text2.setText(new String(data));
}
@FXML
void decrypt(ActionEvent event) throws IOException {
// 文本2中使用gettext方法 获取用户输入的数据
String text = text2.getText();
// 创建变量encoder 在堆中开辟一块空间
BASE64Decoder decoder = new BASE64Decoder();
// 调用解密方法
byte[] bytes = decoder.decodeBuffer(text);
// 把数据显示在文本1里
text1.setText(new String(bytes));
}
}
11)Main中的代码,在Main中运行程序。
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Base64小工具 by:Mauro_K");
primaryStage.setScene(new Scene(root, 600, 400));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
12)在文本1中输入内容,文本2中显示加密后内容,base64加密实现效果如下所示。
13)在文本2中输入内容,文本1中显示解密后内容,base64解密实现效果。