快速学习 JavaFX 进行 GUI 应用开发

news2024/11/22 23:50:52

JavaFX是Java的一个用于构建丰富图形用户界面的框架。通过JavaFX,开发者可以创建功能强大、交互性强且美观的桌面应用程序。

一、JavaFX简介

1. JavaFX的历史和现状

JavaFX最初作为Java的一部分发布,旨在替代Swing作为Java的主要GUI工具包。JavaFX提供了一组丰富的GUI控件、布局管理器和图形绘制功能,支持硬件加速和高性能的用户界面。

2. JavaFX的安装和配置

要使用JavaFX,首先需要在项目中配置JavaFX库。可以通过以下步骤完成:

  • 下载并安装JDK(Java Development Kit)。
  • 下载并配置JavaFX SDK。
  • 配置IDE(如IntelliJ IDEA、Eclipse)以使用JavaFX。

以IntelliJ IDEA为例,配置JavaFX步骤如下:

  1. 创建新的Java项目。
  2. 下载JavaFX SDK并解压。
  3. 配置项目依赖:打开项目结构(Project Structure),选择模块(Modules),添加JavaFX库路径。
  4. 配置运行参数:在运行配置中添加VM选项,如--module-path /path/to/javafx-sdk/lib --add-modules javafx.controls,javafx.fxml

二、JavaFX基础

1. JavaFX应用程序结构

JavaFX应用程序通常继承自javafx.application.Application类,必须重写start(Stage primaryStage)方法。以下是一个简单的JavaFX应用程序:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloWorld extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World");

        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(event -> System.out.println("Hello World!"));

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
2. JavaFX中的Scene和Stage
  • Stage:JavaFX中的顶级容器,代表窗口。primaryStage是主窗口。
  • Scene:场景,包含所有的GUI组件。一个Stage可以包含一个或多个Scene,但一次只能显示一个Scene

三、JavaFX常用组件

JavaFX提供了丰富的UI控件,以下是一些常用组件:

1. 控件概述
  • Button:按钮,用于触发事件。
  • Label:标签,用于显示文本。
  • TextField:文本框,用于输入单行文本。
  • TextArea:文本区域,用于输入多行文本。
  • CheckBox:复选框,用于选择或取消选择。
  • RadioButton:单选按钮,一组单选按钮中只能选择一个。
  • ComboBox:组合框,下拉列表。
  • ListView:列表视图,显示可滚动的项目列表。
2. 使用示例

以下示例展示了如何使用这些控件:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class UIComponentsExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX UI Components");

        Label label = new Label("Label Example");
        Button button = new Button("Button Example");
        TextField textField = new TextField("TextField Example");
        TextArea textArea = new TextArea("TextArea Example");
        CheckBox checkBox = new CheckBox("CheckBox Example");
        RadioButton radioButton = new RadioButton("RadioButton Example");
        ComboBox<String> comboBox = new ComboBox<>();
        comboBox.getItems().addAll("Option 1", "Option 2", "Option 3");
        ListView<String> listView = new ListView<>();
        listView.getItems().addAll("Item 1", "Item 2", "Item 3");

        VBox vbox = new VBox(label, button, textField, textArea, checkBox, radioButton, comboBox, listView);
        Scene scene = new Scene(vbox, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

四、布局管理

JavaFX提供了多种布局管理器,用于安排和组织控件的位置和大小。

1. 常见布局管理器
  • Pane:基本的布局管理器,没有特定布局规则。
  • HBox:水平布局,将子节点排列成一行。
  • VBox:垂直布局,将子节点排列成一列。
  • BorderPane:边界布局,分为顶部、底部、左边、右边和中心区域。
  • GridPane:网格布局,以行和列的形式排列子节点。
  • StackPane:堆叠布局,将子节点堆叠在一起。
  • FlowPane:流式布局,按行或列排列子节点。
  • AnchorPane:锚点布局,可以固定子节点到容器的特定边缘。
2. 布局示例

以下示例展示了如何使用这些布局管理器:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class LayoutExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX Layout Example");

        Button btn1 = new Button("Button 1");
        Button btn2 = new Button("Button 2");
        Button btn3 = new Button("Button 3");
        Button btn4 = new Button("Button 4");

        // HBox
        HBox hbox = new HBox(10, btn1, btn2);

        // VBox
        VBox vbox = new VBox(10, btn3, btn4);

        // BorderPane
        BorderPane borderPane = new BorderPane();
        borderPane.setTop(new Button("Top"));
        borderPane.setBottom(new Button("Bottom"));
        borderPane.setLeft(new Button("Left"));
        borderPane.setRight(new Button("Right"));
        borderPane.setCenter(new Button("Center"));

        // GridPane
        GridPane gridPane = new GridPane();
        gridPane.add(new Button("Grid 1"), 0, 0);
        gridPane.add(new Button("Grid 2"), 1, 0);
        gridPane.add(new Button("Grid 3"), 0, 1);
        gridPane.add(new Button("Grid 4"), 1, 1);

        VBox mainVBox = new VBox(20, hbox, vbox, borderPane, gridPane);
        Scene scene = new Scene(mainVBox, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

五、事件处理

事件处理是JavaFX开发中的重要部分,用于响应用户的操作。

1. 事件模型

JavaFX的事件模型基于观察者模式。事件源是触发事件的对象,事件监听器是处理事件的对象。

2. 常见事件类型
  • ActionEvent:由按钮、菜单项等触发的操作事件。
  • MouseEvent:由鼠标操作触发的事件,如点击、移动、拖动等。
  • KeyEvent:由键盘操作触发的事件,如按键按下、释放等。
3. 事件处理示例

以下示例展示了如何处理按钮点击事件和鼠标事件:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.input.MouseEvent;

public class EventHandlingExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX Event Handling Example");

        Button btn = new Button("Click Me");
        btn.setOnAction(event -> System.out.println("Button clicked!"));

        StackPane root = new StackPane();
        root.getChildren().add(btn);
        root.setOnMouseClicked(this::handleMouseClick);

        Scene scene = new Scene(root, 300, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void handleMouseClick(MouseEvent event) {
        System.out.println("Mouse clicked at: " + event.getSceneX() + ", " + event.getSceneY());
    }

    public static void main(String[] args) {
        launch(args);
    }
}

六、样式和皮肤

JavaFX支持使用CSS(层叠样式表)来定义控件的样式,允许开发者轻松地定制应用程序的外观。

1. 使用CSS样式

可以在外部CSS文件中定义样式,并在Java代码中加载:

/* styles.css */
.button {
    -fx-background-color: #ff0000;
    -fx-text-fill: #ffffff;
}

在Java代码中加载CSS文件:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class CSSExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX CSS Example");

        Button btn = new Button("Styled Button");

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);
        scene.getStylesheets().add(getClass().getResource("styles.css").toExternalForm());

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
2. 内联样式

也可以直接在Java代码中设置样式:

btn.setStyle("-fx-background-color: #ff0000; -fx-text-fill: #ffffff;");

七、动画和特效

JavaFX提供了丰富的动画和特效API,允许开发者创建动态和生动的用户界面。

1. 动画

JavaFX中的动画由Animation类及其子类(如TransitionTimeline等)实现。

以下示例展示了如何创建一个简单的动画:

import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;

public class AnimationExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX Animation Example");

        Button btn = new Button("Animate Me");

        TranslateTransition translateTransition = new TranslateTransition(Duration.millis(2000), btn);
        translateTransition.setFromX(0);
        translateTransition.setToX(200);
        translateTransition.setCycleCount(TranslateTransition.INDEFINITE);
        translateTransition.setAutoReverse(true);

        btn.setOnAction(event -> translateTransition.play());

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 400, 300);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
2. 特效

JavaFX中的特效由Effect类及其子类(如DropShadowBloomGaussianBlur等)实现。

以下示例展示了如何应用阴影效果:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.paint.Color;

public class EffectExample extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX Effect Example");

        Button btn = new Button("Shadowed Button");
        DropShadow dropShadow = new DropShadow();
        dropShadow.setColor(Color.GRAY);
        dropShadow.setRadius(10);
        btn.setEffect(dropShadow);

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

八、FXML和Scene Builder

JavaFX支持使用FXML(XML格式)来描述用户界面。FXML文件可以通过JavaFX Scene Builder(可视化布局工具)创建和编辑。

1. FXML文件

以下是一个简单的FXML文件示例:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.StackPane?>

<StackPane xmlns:fx="http://javafx.com/fxml" fx:controller="com.example.Controller">
    <Button text="Click Me" fx:id="myButton" />
</StackPane>
2. 控制器类

FXML文件中的fx:controller属性指定了控制器类,该类用于处理界面逻辑:

package com.example;

import javafx.fxml.FXML;
import javafx.scene.control.Button;

public class Controller {
    @FXML
    private Button myButton;

    @FXML
    private void initialize() {
        myButton.setOnAction(event -> System.out.println("Button clicked!"));
    }
}
3. 加载FXML文件

在Java代码中加载FXML文件:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class FXMLExample extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("JavaFX FXML Example");

        Parent root = FXMLLoader.load(getClass().getResource("layout.fxml"));
        Scene scene = new Scene(root, 300, 250);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

黑马程序员免费预约咨询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1840626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app中使用富文本rich-text个人经验

rich-text是在uni-app一个内置组件&#xff0c;用于高性能地渲染富文本内容。先贴一下官方的属性列表&#xff1a; 先说一下“selectable” 长按选择区域复制&#xff0c;这个我在APP项目中 不起作用&#xff0c;可能像文档说的&#xff0c;只支持“百度小程序”吧。在APP端起作…

为数据安全护航,袋鼠云在数据分类分级上的探索实践

在大数据时代&#xff0c;数据具有多源异构的特性&#xff0c;且价值各异&#xff0c;企业需依据数据的重要性、价值指数等予以区分&#xff0c;以利采取不同的数据保护举措&#xff0c;避免数据泄露。故而&#xff0c;数据分类分级管理属于数据安全保护中极为重要的环节之一。…

正则表达式写起来不简单,但用起来真香

说在前面 &#x1f388;整理一些常见常用的正则表达式。 常见的正则表达式 1、手机号码 /^[1][3456789][0-9]{9}$/这个正则表达式 /^[1][3456789][0-9]{9}$/ 用于匹配中国的手机号码的一部分&#xff0c;但不包括全部有效的手机号码格式。下面是对它的详细解释&#xff1a; ^…

项目三OpenStack基础环境配置与API使用

任务一 了解OpenStack基础环境配置 1.1 •数据库服务器 1.2 •消息队列服务 •AMQP系统的组成 任务二 了解并使用OpenStack API 2.1 •什么是RESTful API • RESTful API 是目前比较成熟的 一套Internet应用程序的API软件架构 。 • 表现 层&#xff08; Representation …

JavaWeb项目配置教程

将你的项目&#xff08;只有代码的文件&#xff0c;不是整个文件&#xff09;拖入idea 找到数据库配置代码&#xff08;一般在Util包里面&#xff0c;或者是properties配置文件&#xff09;并将密码修改为你的数据库密码。 点击Edit Configurations 点击Configure&#xff0…

突破数据存储瓶颈!转转业财系统亿级数据存储优化实践--图文解析

突破数据存储瓶颈&#xff01;转转业财系统亿级数据存储优化实践–图文解析 原文链接&#xff1a;https://juejin.cn/post/7358704806779437097 原文作者&#xff1a;转转技术团队 业财系统&#xff1a;业务和财务一体化系统 与传统财务记账不同&#xff0c;一笔金额不再是…

LED电子看板在提升企业数字化管理的应用价值

本文详细探讨 LED 电子看板在企业数字化管理中的应用价值&#xff0c;包括实时数据展示、可视化管理、提高生产效率、优化决策等方面&#xff0c;通过实际案例分析&#xff0c;阐述了其对企业发展的重要性。在当今数字化时代&#xff0c;企业管理面临着越来越多的挑战和机遇。为…

企业IT资源使用共享云桌面集中管理的优势

随着信息技术的飞速发展&#xff0c;企业面临着日益增长的IT资源需求和管理挑战。为了解决这一问题&#xff0c;越来越多的企业开始采用云桌面集中管理方案&#xff0c;以实现IT资源的共享和优化。 为保持企业各部门信息化和数字化业务顺利运转&#xff0c;IT需要耗费大量支持…

【BFS算法】广度搜索·由起点开始逐层向周围扩散求得最短路径(算法框架+题目)

0、前言 深度优先搜索是DFS&#xff08;Depth Frst Search)&#xff0c;其实就是前面所讲过的回溯算法&#xff0c;它的特点和它的名字一样&#xff0c;首先在一条路径上不断往下&#xff08;深度&#xff09;遍历&#xff0c;获得答案之后再返回&#xff0c;再继续往下遍历。…

使用SQLite

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 与许多其他数据库管理系统不同&#xff0c;SQLite不是一个客户端/服务器结构的数据库引擎&#xff0c;而是一种嵌入式数据库&#xff0c;它的数据库就…

微量氧传感器在3D打印中的应用

3D打印为什么需要监测氧气&#xff1f; 金属 3D 打印过程涉及使用激光技术将细金属粉末一层一层地熔合在一起。在制造零件的同时将杂质风险降至比较低是金属增材制造行业面临的主要挑战。金属 3D 打印机通常将其原料送入惰性环境中&#xff0c;以消除污染并防止质量问题。氩气…

【自撰写】【国际象棋入门】第6课 常见术语分析(一)吃双和抽将

第6课 常见术语分析&#xff08;一&#xff09;吃双和抽将 本次课中&#xff0c;我们介绍几种最为常见和常用的&#xff08;单步棋形成&#xff09;的局面、术语并对其进行简单的分析。一般说来&#xff0c;这些局面都会给予一方以“立竿见影”的优势&#xff0c;或者引向之后…

瑞尼克定制聚四氟乙烯布氏漏斗配抽滤瓶四氟抽滤装置药厂

一、产品介绍 布氏漏斗是实验室中使用的一种仪器&#xff0c;用来使用真空或负压力抽吸进行过滤。布氏漏斗可代替陶瓷布氏漏斗&#xff0c;避免碎裂&#xff0c;聚四氟乙烯材质的布氏漏斗性强&#xff0c;使用真空或负压力抽吸进行过滤也可与吸滤瓶配套&#xff0c;用于无机制…

window 卸载应用商店程序

# 使用Get-AppxPackage获取所有应用程序 # 使用Remove-AppxPackage PythonSoftwareFoundation.Python.3.12_3.12.1264.0_x64__qbz5n2kfra8p0

2024请收好这一份全面--详细的AI产品经理从业指南

前言 入行人工智能领域这段时间以来&#xff0c;从零到一把AI推荐系统产品化搭建了起来&#xff0c;也与很多同行AI产品经理小伙伴建立了联系。AI产品经理工作内容各异&#xff0c;不同AI产品化生命周期中更是大为不同&#xff0c;但对想入行AI产品经理的小伙伴来讲&#xff0…

聊一聊生成式AI

生成式AI&#xff08;Generative AI&#xff09;是指一类能够自主创造新内容的人工智能技术&#xff0c;这些内容可以是文本、图像、音频、视频等。与传统的分析性或分类性AI系统不同&#xff0c;生成式模型的主要任务不是对现有数据进行分类或预测&#xff0c;而是生成全新的、…

【C语言 || 排序】希尔排序

文章目录 前言1.希尔排序1.1 直接插入排序1.2 直接插入排序的实现1.2.1 直接插入排序的代码实现 1.3 直接插入排序的时间复杂度1.4 希尔排序1.4.1 希尔排序概念1.4.1 希尔排序的代码实现 前言 1.希尔排序 1.1 直接插入排序 在写希尔排序之前&#xff0c;我们需要先了解直接插入…

电压模式R-2R DAC的工作原理和特性

本文将探讨电压模式R-2R DAC结构。 在本文中&#xff0c;我们将探索什么是R-2R DAC以及如何实现它们。 首先&#xff0c;我们将简要回顾一下开尔文分压器DAC。这种结构很简单&#xff0c;但它们需要大量的电阻和开关来实现高分辨率DAC。这个问题的一个解决方案是称为R-2R DAC…

【python】用代码实现2024中科大强基计划数学科目第一题

题目&#xff1a; 已知正整数a,b,c满足10a11b12c123,&#xff0c;则&#xff08;a,b,c&#xff09;的组数是 思路&#xff1a; 为了找出满足等式 10a 11b 12c 123 的正整数三元组 (a, b, c) 的数量&#xff0c;我们可以使用Python编写一个简单的循环来遍历可能的 a、b 和…

哪种考勤机好用,常见好用的考勤机种类

哪种考勤机好用&#xff0c;常见好用的考勤机种类 用考勤机完成上下班打卡制度&#xff0c;极大地为人事对公司的管理提供了便利。不同种类的考勤机均有各自的长处&#xff0c;那么究竟哪种考勤机比较好用呢&#xff1f;其中&#xff0c;智能云考勤机能够实现异地手机打卡&…