JavaFX控件库的跨平台应用:一次编写,到处运行
发布时间: 2024-10-23 16:12:31 阅读量: 42 订阅数: 32
FxPaint:用JavaFx编写的Paint应用
![JavaFX](https://user-images.githubusercontent.com/14715892/27860895-2c31e3f0-619c-11e7-9dc2-9c9b9d75a416.png)
# 1. JavaFX控件库简介
JavaFX是Java平台上的一个图形库,它为开发富客户端应用程序提供了一种全新的方式。与Swing和AWT不同,JavaFX提供了一种更加模块化、更易用的编程接口和一个丰富的组件库,旨在简化用户界面的开发过程。本章将介绍JavaFX的基本概念,并探讨其在现代Java应用程序中的重要性。我们将简要回顾JavaFX的起源,以及它如何适应现代应用开发的需要。随着本章的深入,读者将会了解到JavaFX的技术栈,包括其场景图模型、事件处理机制和丰富的控件集合,这为后续章节中探索更高级的控件和布局特性奠定了基础。
# 2. JavaFX控件库核心组件
### 2.1 JavaFX的场景和舞台
#### 2.1.1 场景的创建与布局
在JavaFX中,场景(Scene)是一个容器,它包含了应用中的所有可见元素。每个场景都必须有一个根节点,这个根节点可以是任何类型的节点,但是通常是布局容器。布局容器会负责管理其子节点的位置和尺寸。
创建一个场景通常涉及以下步骤:
1. 创建一个根节点,通常是一个布局容器,如`Group`、`StackPane`、`HBox`、`VBox`等。
2. 向根节点中添加子节点。
3. 创建一个`Scene`对象,并将根节点作为参数传递给它。
4. 将创建好的`Scene`设置到一个`Stage`上,`Stage`是JavaFX应用的顶级窗口。
```java
// 示例代码:创建一个场景并设置到舞台上
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class SimpleSceneExample extends Application {
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
root.getChildren().add(new Text("Hello, JavaFX!"));
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
```
- `StackPane`是一个简单的布局容器,它将所有子节点堆叠在一起,如果有重叠则后者覆盖前者。
- `Text`是显示文本的节点。
- `Scene`构造函数中,第一个参数是根节点,后两个参数分别是场景的宽度和高度。
#### 2.1.2 舞台的作用与控制
舞台(Stage)是JavaFX应用中的顶层窗口,它负责显示一个或多个场景。一个舞台可能有标题栏、菜单、边框、状态栏等。当用户关闭窗口时,JavaFX平台会结束应用的运行。
控制舞台的常见属性包括:
- `setTitle(String title)`: 设置窗口标题。
- `setFullScreen(boolean value)`: 设置是否全屏显示。
- `setResizable(boolean value)`: 设置是否允许用户调整窗口大小。
- `setScene(Scene scene)`: 设置舞台中显示的场景。
```java
// 示例代码:控制舞台属性
primaryStage.setTitle("我的JavaFX窗口");
primaryStage.setFullScreen(true);
primaryStage.setResizable(false);
```
舞台还可以通过其`show()`和`hide()`方法来控制显示和隐藏。舞台的显示逻辑是异步的,如果在非JavaFX应用线程中尝试打开舞台,需要使用`Platform.runLater()`来确保线程安全。
### 2.2 常用JavaFX控件详解
#### 2.2.1 按钮和文本框
按钮(Button)和文本框(TextField)是JavaFX中最常用的控件之一。按钮用于触发事件,文本框用于输入文本。
按钮的创建和事件绑定如下:
```java
Button button = new Button("点击我");
button.setOnAction(event -> {
// 事件处理逻辑
});
```
文本框的创建和基本使用如下:
```java
TextField textField = new TextField();
textField.setText("初始文本");
```
按钮和文本框都可以通过CSS样式自定义外观。例如,可以通过CSS改变按钮的样式、文本框的字体大小等。
```java
// CSS样式示例
.buttonStyle {
-fx-background-color: #4CAF50;
-fx-text-fill: white;
-fx-font-size: 16;
}
.textFieldStyle {
-fx-font-size: 14;
}
```
然后在Java代码中设置这些样式:
```java
button.setStyle("-fx-background-color: #4CAF50; -fx-text-fill: white; -fx-font-size: 16;");
textField.setStyle("-fx-font-size: 14;");
```
#### 2.2.2 列表视图和表格视图
列表视图(ListView)和表格视图(TableView)是用于展示列表和表格数据的控件。它们都支持虚拟化,这意味着它们可以高效地处理大量数据,而不需要将所有数据加载到内存中。
列表视图的创建和基本使用如下:
```java
ListView<String> listView = new ListView<>();
listView.getItems().addAll("项1", "项2", "项3");
```
表格视图的创建和基本使用如下:
```java
TableView<Person> table = new TableView<>();
TableColumn<Person, String> nameColumn = new TableColumn<>("姓名");
nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
table.getColumns().add(nameColumn);
```
其中`Person`是一个简单的JavaBean类,包含一个`name`属性。
#### 2.2.3 滑动条和进度条
滑动条(Slider)和进度条(ProgressBar)提供了一种方式让用户通过滑动一个条来选择一个范围内的值,或者显示一个操作的进度。
滑动条的创建和基本使用如下:
```java
Slider slider = new Slider();
slider.setMin(0);
slider.setMax(100);
slider.setValue(50);
```
进度条的创建和基本使用如下:
```java
ProgressBar progressBar = new ProgressBar(0.5); // 初始值为0.5表示50%
```
滑动条和进度条都可以设置各种属性来控制其外观和行为,比如方向(水平或垂直)、步长、增量等。
### 2.3 控件的事件处理
#### 2.3.1 事件监听器的种类和使用
JavaFX支持多种类型的事件监听器,它们可以分为两类:基本事件监听器和复杂事件监听器。
基本事件监听器:
- `setOnAction`: 用于按钮点击事件等。
- `setOnKeyPressed`和`setOnKeyReleased`: 用于键盘事件。
- `setOnMousePressed`和`setOnMouseReleased`: 用于鼠标事件。
复杂事件监听器:
- `setOnChangeListener`: 用于属性变化事件,如滑动条值的变化。
- `setOnExceptionHandler`: 用于捕获和处理异常事件。
示例:为按钮添加点击事件监听器:
```java
button.setOnAction(event -> {
// 按钮点击时的逻辑
System.out.println("按钮被点击了");
});
```
#### 2.3.2 事件传播机制与处理策略
JavaFX使用事件传播机制来管理事件的传递。当事件发生在节点上时,它会按照以下顺序传递:
1. 从
0
0