javafx
JavaFX 组件详解
1. 属性绑定
意义作用:自动同步两个属性的值(一个属性变化时,另一个自动更新)
头文件:import javafx.beans.binding.*;
创建要求:两个属性需实现Property接口(如SimpleIntegerProperty)
运用方法:bind()方法单向绑定,Bindings工具类创建复杂绑定
java
import javafx.application.Application;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class BindingDemo extends Application {
@Override
public void start(Stage stage) {
// 创建两个可绑定属性
SimpleIntegerProperty num1 = new SimpleIntegerProperty(10);
SimpleIntegerProperty num2 = new SimpleIntegerProperty(20);
// 创建标签显示值
Label label1 = new Label();
Label label2 = new Label();
// 绑定标签文本到属性值(自动更新)
label1.textProperty().bind(num1.asString("num1: %d"));
label2.textProperty().bind(Bindings.add(num1, num2).asString("Sum: %d"));
// 修改原始值(将自动更新标签)
num1.set(30);
VBox root = new VBox(10, label1, label2);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
2. 网格布局
意义作用:网格布局,按行/列排列组件
头文件:import javafx.scene.layout.GridPane;
创建要求:无特殊要求
运用方法:add(component, column, row)添加组件
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class GridPaneDemo extends Application {
@Override
public void start(Stage stage) {
GridPane grid = new GridPane();
grid.setHgap(10); // 水平间距
grid.setVgap(10); // 垂直间距
// 创建按钮并添加到网格
Button btn1 = new Button("(0,0)");
Button btn2 = new Button("(1,0)");
Button btn3 = new Button("(0,1)");
Button btn4 = new Button("(1,1)");
// 添加组件:组件, 列索引, 行索引
grid.add(btn1, 0, 0);
grid.add(btn2, 1, 0);
grid.add(btn3, 0, 1);
grid.add(btn4, 1, 1);
Scene scene = new Scene(grid, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
3. 文本字体与颜色
意义作用:
Color:定义颜色(RGB/HSB)
Font:设置文本字体样式
头文件:
java
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
基础代码:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class ColorFontDemo extends Application {
@Override
public void start(Stage stage) {
Text text = new Text("Hello JavaFX!");
// 设置颜色(RGB值)
text.setFill(Color.rgb(255, 0, 0)); // 红色
// 设置字体(名称、大小)
text.setFont(Font.font("Arial", 30));
VBox root = new VBox(text);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
4. 区域划分
意义作用:分五个区域布局(上/下/左/右/中)
头文件:import javafx.scene.layout.BorderPane;
运用方法:
java
BorderPane root = new BorderPane();
root.setTop(topNode); // 顶部组件
root.setCenter(centerNode); // 中央组件
完整代码:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class BorderPaneDemo extends Application {
@Override
public void start(Stage stage) {
BorderPane root = new BorderPane();
// 创建五个区域的按钮
Button top = new Button("Top");
Button left = new Button("Left");
Button center = new Button("Center");
Button right = new Button("Right");
Button bottom = new Button("Bottom");
// 将按钮放入对应区域
root.setTop(top);
root.setLeft(left);
root.setCenter(center);
root.setRight(right);
root.setBottom(bottom);
Scene scene = new Scene(root, 400, 300);
stage.setScene(scene);
stage.show();
}
}`
5.水平与垂直组件
意义作用:
HBox:水平排列组件
VBox:垂直排列组件
头文件:
java
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
代码演示:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class BoxDemo extends Application {
@Override
public void start(Stage stage) {
// HBox:水平排列
HBox hbox = new HBox(10); // 间距10像素
hbox.getChildren().addAll(
new Button("Button1"),
new Button("Button2")
);
// VBox:垂直排列
VBox vbox = new VBox(10);
vbox.getChildren().addAll(
new Button("Button3"),
new Button("Button4")
);
// 将HBox和VBox放入另一个VBox
VBox root = new VBox(20, hbox, vbox);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
6. 加载和显示图片
意义作用:
Image:加载图像文件
ImageView:显示图像
头文件:
java
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
基础代码:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import java.io.FileInputStream;
public class ImageDemo extends Application {
@Override
public void start(Stage stage) throws Exception {
// 从文件加载图像(替换为实际路径)
Image image = new Image(new FileInputStream("path/to/image.jpg"));
// 创建图像视图
ImageView imageView = new ImageView(image);
imageView.setFitWidth(300); // 设置显示宽度
imageView.setPreserveRatio(true); // 保持宽高比
StackPane root = new StackPane(imageView);
Scene scene = new Scene(root, 400, 300);
stage.setScene(scene);
stage.show();
}
}`
7. 画直线
意义作用:
Text:显示文本
Line:绘制直线
头文件:
java
import javafx.scene.text.Text;
import javafx.scene.shape.Line;
代码演示:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class TextLineDemo extends Application {
@Override
public void start(Stage stage) {
Pane root = new Pane();
// 创建文本(位置X/Y)
Text text = new Text(50, 50, "Hello JavaFX!");
text.setFill(Color.BLUE);
// 创建直线(起点X/Y, 终点X/Y)
Line line = new Line(20, 100, 280, 100);
line.setStroke(Color.RED);
line.setStrokeWidth(2);
root.getChildren().addAll(text, line);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
8.画矩形
意义作用:绘制矩形
头文件:import javafx.scene.shape.Rectangle;
基础代码:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class RectangleDemo extends Application {
@Override
public void start(Stage stage) {
Rectangle rect = new Rectangle(50, 50, 200, 100); // (x, y, width, height)
rect.setFill(Color.LIGHTGREEN); // 填充色
rect.setStroke(Color.DARKGREEN); // 边框色
rect.setStrokeWidth(3); // 边框粗细
Pane root = new Pane(rect);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
9. 画圆形和椭圆
意义作用:
Circle:绘制圆形
Ellipse:绘制椭圆
头文件:
java
import javafx.scene.shape.Circle;
import javafx.scene.shape.Ellipse;
代码演示:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Ellipse;
import javafx.stage.Stage;
public class CircleEllipseDemo extends Application {
@Override
public void start(Stage stage) {
// 圆形:圆心X/Y, 半径
Circle circle = new Circle(100, 80, 50);
circle.setFill(Color.RED);
// 椭圆:圆心X/Y, 水平半径, 垂直半径
Ellipse ellipse = new Ellipse(200, 80, 70, 40);
ellipse.setFill(Color.BLUE);
Pane root = new Pane(circle, ellipse);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
10. 画圆弧,扇形
意义作用:绘制圆弧
头文件:import javafx.scene.shape.Arc;
关键参数:中心点、半径、起始角度、圆弧角度
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Arc;
import javafx.scene.shape.ArcType;
import javafx.stage.Stage;
public class ArcDemo extends Application {
@Override
public void start(Stage stage) {
// 创建圆弧:中心X/Y, 水平半径, 垂直半径, 起始角度, 圆弧角度
Arc arc = new Arc(150, 100, 80, 60, 45, 90);
arc.setType(ArcType.ROUND); // 类型(OPEN/CHORD/ROUND)
arc.setFill(Color.YELLOW);
arc.setStroke(Color.BLACK);
Pane root = new Pane(arc);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
11. 绘制多边形和线段
意义作用:
Polygon:绘制封闭多边形
Polyline:绘制不封闭多段线
头文件:
java
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Polyline;
代码演示:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Polyline;
import javafx.stage.Stage;
public class PolygonDemo extends Application {
@Override
public void start(Stage stage) {
// 多边形(自动闭合)
Polygon triangle = new Polygon(
100, 20, // 点1 (x,y)
50, 80, // 点2
150, 80 // 点3
);
triangle.setFill(Color.LIGHTBLUE);
// 多段线(不闭合)
Polyline polyline = new Polyline(
200, 20,
180, 80,
220, 80
);
polyline.setStroke(Color.RED);
polyline.setStrokeWidth(2);
Pane root = new Pane(triangle, polyline);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
12. 沿路径移动的动画
意义作用:让节点沿路径移动的动画
头文件:import javafx.animation.PathTransition;
基础代码:
java
`import javafx.animation.PathTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.util.Duration;
import javafx.stage.Stage;
public class PathTransitionDemo extends Application {
@Override
public void start(Stage stage) {
// 创建移动目标(矩形)
Rectangle rect = new Rectangle(20, 20, 40, 40);
rect.setFill(Color.RED);
// 创建路径(圆形路径)
Circle path = new Circle(150, 100, 80);
path.setFill(null);
path.setStroke(Color.GRAY);
// 创建路径动画
PathTransition pt = new PathTransition();
pt.setNode(rect); // 要移动的节点
pt.setPath(path); // 移动路径
pt.setDuration(Duration.seconds(3)); // 动画时长
pt.setCycleCount(2); // 循环次数(2次)
pt.setAutoReverse(true); // 自动反向
Pane root = new Pane(rect, path);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
pt.play(); // 播放动画
}
}`
13. 淡入淡出动画
意义作用:淡入淡出动画效果
头文件:import javafx.animation.FadeTransition;
代码演示:
java
`import javafx.animation.FadeTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.util.Duration;
import javafx.stage.Stage;
public class FadeDemo extends Application {
@Override
public void start(Stage stage) {
Rectangle rect = new Rectangle(200, 100, Color.BLUE);
// 创建淡入淡出动画
FadeTransition ft = new FadeTransition();
ft.setNode(rect); // 作用节点
ft.setDuration(Duration.seconds(2)); // 动画时长
ft.setFromValue(1.0); // 起始透明度(1.0=不透明)
ft.setToValue(0.2); // 结束透明度
ft.setCycleCount(4); // 循环次数(4次)
ft.setAutoReverse(true); // 自动反向
StackPane root = new StackPane(rect);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
ft.play(); // 播放动画
}
}`
14.移动动画控制
意义作用:基于关键帧的动画控制
头文件:
java
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.util.Duration;
代码演示(移动矩形):
java
`import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.util.Duration;
import javafx.stage.Stage;
public class TimelineDemo extends Application {
@Override
public void start(Stage stage) {
Rectangle rect = new Rectangle(50, 50, 60, 40);
rect.setFill(Color.GREEN);
// 创建时间轴动画
Timeline timeline = new Timeline(
new KeyFrame(Duration.ZERO, e -> rect.setX(0)), // 初始位置
new KeyFrame(Duration.seconds(2), e -> rect.setX(200)) // 2秒后位置
);
timeline.setAutoReverse(true);
timeline.setCycleCount(Timeline.INDEFINITE); // 无限循环
Pane root = new Pane(rect);
Scene scene = new Scene(root, 300, 150);
stage.setScene(scene);
stage.show();
timeline.play();
}
}`
15. 文本标签样式
意义作用:
Labeled:可带文本的组件基类
Label:简单文本标签
头文件:import javafx.scene.control.Label;
基础代码:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class LabelDemo extends Application {
@Override
public void start(Stage stage) {
// 创建带样式的标签
Label label = new Label("Hello JavaFX!");
label.setStyle("-fx-font-size: 24; -fx-text-fill: red;");
StackPane root = new StackPane(label);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
16. checkbox复选框
意义作用:复选框(多选)
头文件:import javafx.scene.control.CheckBox;
事件处理:setOnAction()监听状态变化
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class CheckBoxDemo extends Application {
@Override
public void start(Stage stage) {
CheckBox checkBox = new CheckBox("同意协议");
Label label = new Label("状态:未选中");
// 监听选择状态变化
checkBox.setOnAction(e ->
label.setText("状态:" + (checkBox.isSelected() ? "选中" : "未选中"))
);
VBox root = new VBox(20, checkBox, label);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
17. 下拉选择框
意义作用:下拉选择框
头文件:import javafx.scene.control.ComboBox;
基础用法:
java
`import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ComboBoxDemo extends Application {
@Override
public void start(Stage stage) {
// 创建下拉框并添加选项
ComboBox
comboBox.getItems().addAll("Java", "Python", "C++", "JavaScript");
comboBox.setValue("Java"); // 默认选中项
Label label = new Label("当前选择:Java");
// 监听选择变化
comboBox.setOnAction(e ->
label.setText("当前选择:" + comboBox.getValue())
);
VBox root = new VBox(20, comboBox, label);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
18. 单选按钮
意义作用:单选按钮(需配合ToggleGroup)
头文件:
java
import javafx.scene.control.RadioButton;
import javafx.scene.control.ToggleGroup;
代码演示:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.RadioButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class RadioButtonDemo extends Application {
@Override
public void start(Stage stage) {
ToggleGroup group = new ToggleGroup(); // 单选组
RadioButton rb1 = new RadioButton("选项1");
rb1.setToggleGroup(group);
rb1.setSelected(true); // 默认选中
RadioButton rb2 = new RadioButton("选项2");
rb2.setToggleGroup(group);
Label label = new Label("当前选择:选项1");
// 监听选择变化
group.selectedToggleProperty().addListener((obs, oldVal, newVal) -> {
if (newVal != null) {
label.setText("当前选择:" + ((RadioButton)newVal).getText());
}
});
VBox root = new VBox(10, rb1, rb2, label);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
19. 单/多行输入
意义作用:
TextField:单行文本输入
TextArea:多行文本输入
头文件:
java
import javafx.scene.control.TextField;
import javafx.scene.control.TextArea;
代码演示:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TextInputDemo extends Application {
@Override
public void start(Stage stage) {
TextField textField = new TextField();
textField.setPromptText("输入单行文本");
TextArea textArea = new TextArea();
textArea.setPromptText("输入多行文本");
Button button = new Button("显示内容");
button.setOnAction(e ->
System.out.println("Field: " + textField.getText() + "\nArea: " + textArea.getText())
);
VBox root = new VBox(10, textField, textArea, button);
Scene scene = new Scene(root, 300, 250);
stage.setScene(scene);
stage.show();
}
}`
20. 键盘事件
意义作用:响应键盘操作(按键按下/释放)
头文件:import javafx.scene.input.KeyEvent;
监听方法:setOnKeyPressed() / setOnKeyReleased()
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class KeyEventDemo extends Application {
@Override
public void start(Stage stage) {
Text text = new Text("按任意键");
StackPane root = new StackPane(text);
Scene scene = new Scene(root, 300, 200);
// 监听键盘按下事件
scene.setOnKeyPressed(e ->
text.setText("按下: " + e.getCode())
);
// 监听键盘释放事件
scene.setOnKeyReleased(e ->
text.setText("释放: " + e.getCode())
);
stage.setScene(scene);
stage.show();
}
}`
21. 滑动课选择列表
意义作用:显示可滚动列表
头文件:import javafx.scene.control.ListView;
基础用法:
java
`import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ListViewDemo extends Application {
@Override
public void start(Stage stage) {
ListView
listView.getItems().addAll("苹果", "香蕉", "橘子", "西瓜");
Label label = new Label("未选中");
// 监听选中项变化
listView.getSelectionModel().selectedItemProperty().addListener(
(obs, oldVal, newVal) -> label.setText("选中: " + newVal)
);
VBox root = new VBox(10, listView, label);
Scene scene = new Scene(root, 200, 250);
stage.setScene(scene);
stage.show();
}
}`
22.滑动条
意义作用:滚动条控件
头文件:import javafx.scene.control.ScrollBar;
代码演示:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollBar;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ScrollBarDemo extends Application {
@Override
public void start(Stage stage) {
ScrollBar scrollBar = new ScrollBar();
scrollBar.setMin(0);
scrollBar.setMax(100);
scrollBar.setValue(50); // 初始值
Label label = new Label("当前值: 50");
// 绑定标签文本到滚动条值
label.textProperty().bind(scrollBar.valueProperty().asString("当前值: %.1f"));
VBox root = new VBox(20, scrollBar, label);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}`
23.滑动条常用版(选择刻度显示)
意义作用:滑块控件(比ScrollBar更常用)
头文件:import javafx.scene.control.Slider;
基础代码:
java
`import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class SliderDemo extends Application {
@Override
public void start(Stage stage) {
Slider slider = new Slider(0, 100, 50); // 最小值, 最大值, 初始值
slider.setShowTickMarks(true); // 显示刻度
slider.setShowTickLabels(true);
slider.setMajorTickUnit(25); // 主刻度间隔
Label label = new Label("当前值: 50");
// 绑定标签文本到滑块值
label.textProperty().bind(slider.valueProperty().asString("当前值: %.0f"));
VBox root = new VBox(20, slider, label);
Scene scene = new Scene(root, 300, 200);
stage.setScene(scene);
stage.show();
}
}
`

浙公网安备 33010602011771号