【多媒体】富客户端应用程序GUI框架 JavaFX 2.0 简介

JavaFX 最初是由 Oracle 推出的一个用于开发富客户端应用程序的框架,它提供了丰富的用户界面控件、布局容器、3D图形绘制、媒体播放和动画等功能,旨在取代较旧的 Swing 框架。JavaFX 于 2007 年推出,2011 年 10 月发布了2.0 版本。JavaFX 2.0 的一个优点是适用于跨平台,而且可以完全用 Java 语言编写代码。

2014年发布的JDK 8.0就包含了JavaFx 2.0 版本。然而,随着时间的发展和技术的变迁,JavaFx 2.0并未达到预期目标,而且在与其他的技术标准竟争中处于下风。从 JDK 11 开始,Oracle 决定不再将 JavaFX 包含在 JDK 中,如有需要JavaFX必须单独下载和使用。
尽管如此,JavaFX 仍然是一个强大的开发工具,开发者可用它来设计、编写、测试、调试和部署富客户端程序,支持跨平台使用。

我们先来看一个简单的“欢迎使用JavaFX”例程,其源代码如下:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;public class 欢迎使用JavaFX extends Application {@Override public void start(Stage stage) {Text text = new Text(10, 40, "欢迎使用 JavaFX !");text.setFont(new Font(40));Scene scene = new Scene(new Group(text), 400, 100);stage.setTitle("欢迎使用JavaFX");stage.setScene(scene);stage.sizeToScene();stage.show();}public static void main(String[] args) {Application.launch(args);}
}

程序演示结果:
在这里插入图片描述

下面再来看一个“3D图像演示”例程,其源代码如下:

/***3D图像演示例程***/
import javafx.application.Application;  
import javafx.scene.*;  
import javafx.scene.paint.Color;  
import javafx.scene.paint.PhongMaterial;  
import javafx.scene.shape.*;  
import javafx.stage.Stage; 
public class Shapes3DViewer extends Application {@Override public void start(Stage stage) {  PhongMaterial material = new PhongMaterial();  material.setDiffuseColor(Color.LIGHTGRAY);  material.setSpecularColor(Color.rgb(30, 30, 30));  Shape3D[] meshView = new Shape3D[] {  new Box(200, 200, 200),  new Sphere(100),  new Cylinder(100, 200),  };  for (int i=0; i!=3; ++i) {  meshView[i].setMaterial(material);  meshView[i].setTranslateX((i + 1) * 220);  meshView[i].setTranslateY(200);  meshView[i].setTranslateZ(20);  meshView[i].setDrawMode(DrawMode.FILL);  meshView[i].setCullFace(CullFace.BACK);  };  PointLight pointLight = new PointLight(Color.ANTIQUEWHITE);  pointLight.setTranslateX(800);  pointLight.setTranslateY(-100);  pointLight.setTranslateZ(-1000);  Group root = new Group(meshView);  root.getChildren().add(pointLight);  Scene scene = new Scene(root, 800, 400, true);  scene.setFill(Color.rgb(10, 10, 40));  scene.setCamera(new PerspectiveCamera(false)); stage.setTitle("3D图像演示");stage.setScene(scene);  stage.show();  }  public static void main(String[] args) {  Application.launch(args);  }  }

3D图像演示效果图:
在这里插入图片描述

JavaFX提供了丰富的控件来构造所需要的程序界面。JavaFX提供了一种容器控件,即面板Pane来简化解决这个问题,不同类型的面板采用不同的布局策略。我们可以根据实际的需要来选择不同的面板,从而构造出我们所需要的界面。下面就介绍几种常用的面板。

(一) FlowPane面板
它采用的布局管理器实际上就是AWT的FlowLayout:按照控件的添加次序按个摆放,按照从上到下、从左到右的次序摆放。当面板的大小发生变化后,舞台的大小也自动跟着变化,场景的大小也自动跟着调整,并且会重新计算各个控件的位置,重新摆放各个控件的位置。

FlowPane测试例程:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class PaneTest extends Application {public static Pane FlowPaneTest() {FlowPane pane = new FlowPane();pane.setPadding(new Insets(11, 12, 13, 14));//设置控件之间的垂直间隔距离pane.setHgap(5);//设置控件之间的水平间隔距离pane.setVgap(5);Label lbName = new Label("姓名:");TextField tfName = new TextField();Label lbPassword = new Label("密码:");TextField tfPassword = new TextField();   Button okbtn = new Button("递交");pane.getChildren().addAll(lbName,tfName,lbPassword,tfPassword,okbtn);return pane;}@Overridepublic void start(Stage stage) {Pane pane = FlowPaneTest();// 创建场景Scene scene = new Scene(pane, 600, 150);// 设置舞台stage.setScene(scene);stage.setTitle("JavaFX面板演示");stage.show();}public static void main(String[] args) {launch(args);}
}

例程演示结果图一:
例程结果图01
当程序主窗口宽度变小时,例程演示结果图二:
在这里插入图片描述

(二) GridPane面板
它采用的布局管理器实际上就是AWT中的GridLayout:将整个面板划分为若干个格子,每个格子的大小是一样的,每个格子中可以放置一个控件,类似于网格的形式。
GridPane测试例程:


import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class PaneTest extends Application {public static Pane FlowPaneTest() {FlowPane pane = new FlowPane();pane.setPadding(new Insets(11, 12, 13, 14));//设置控件之间的垂直间隔距离pane.setHgap(5);//设置控件之间的水平间隔距离pane.setVgap(5);Label lbName = new Label("姓名:");TextField tfName = new TextField();Label lbPassword = new Label("密码:");TextField tfPassword = new TextField();   Button okbtn = new Button("递交");pane.getChildren().addAll(lbName,tfName,lbPassword,tfPassword,okbtn);return pane;}public Pane GridPaneTest() {GridPane pane = new GridPane();pane.setAlignment(Pos.CENTER);pane.setPadding(new Insets(11.5, 12.5, 13.5, 14.5));pane.setHgap(5.5);pane.setVgap(5.5);pane.add(new Button("按钮A"), 0, 0);pane.add(new Button("按钮B"), 1, 0);pane.add(new Button("按钮C"), 0, 1);pane.add(new Button("按钮D"), 1, 1);pane.add(new Button("按钮E"), 0, 2);pane.add(new Button("按钮F"), 1, 2);return pane;}public void BorderPaneTest() {}public void HBoxTest() {}public void VBoxTest() {}@Overridepublic void start(Stage stage) {//Pane pane = FlowPaneTest();Pane pane = GridPaneTest();// 创建场景Scene scene = new Scene(pane, 320, 150);// 设置舞台stage.setScene(scene);stage.setTitle("JavaFX面板演示");stage.show();}public static void main(String[] args) {launch(args);}
}

测试演示结果页面:
在这里插入图片描述

(三) BorderPane面板
它采用的布局管理器实际上就是AWT中的BorderLayout:将整个面板划分五个区域,分别是上、下、左、右、中,每个区域可以放置一个控件。
在此我们提供一个综合性的演示例程,它还组合使用了后续将要介绍的“HBox面板”和“VBox面板”,请看源代码:

/***BorderPane演示例程***/
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.Separator;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;public class BorderPaneExample extends Application {private BorderPane root;@Overridepublic void start(Stage primaryStage) throws Exception{root = new BorderPane();        root.setTop(getMenu());root.setRight(getRightHBox());root.setBottom(getFooter());root.setLeft(getLeftHBox());root.setCenter(getCenterPane());Scene scene = new Scene(root, 900, 500);        primaryStage.setTitle("BorderPane演示");primaryStage.setScene(scene);primaryStage.show();    }private MenuBar getMenu(){MenuBar menuBar = new MenuBar();Menu menuFile = new Menu("文件");                Menu menuEdit = new Menu("编辑");Menu menuHelp = new Menu("帮助");        menuBar.getMenus().addAll(menuFile, menuEdit, menuHelp);return menuBar;}private HBox getRightHBox(){HBox hbox = new HBox();VBox vbox = new VBox(50);vbox.setPadding(new Insets(0, 20, 0, 20));vbox.setAlignment(Pos.CENTER);vbox.getChildren().addAll(new Text("其他提示信息A"), new Text("其他提示信息B"), new Text("其他提示信息C"));    hbox.getChildren().addAll(new Separator(Orientation.VERTICAL), vbox);     return hbox;}private HBox getLeftHBox(){HBox hbox = new HBox();VBox vbox = new VBox(10);vbox.setPadding(new Insets(10));Text text = new Text("导航");text.setFont(Font.font("Helvetica", FontWeight.BOLD, 20));VBox vboxText = new VBox(10);for (int i = 1; i <= 10; i++){vboxText.getChildren().add(new Text("目录 " + i));}        Text text2 = new Text("结束位");text2.setFont(Font.font("Helvetica", FontWeight.BOLD, 20));vbox.getChildren().addAll(text, vboxText, text2);         hbox.getChildren().addAll(vbox, new Separator(Orientation.VERTICAL));return hbox;}private VBox getFooter(){VBox vbox = new VBox();HBox hbox = new HBox(20);hbox.setPadding(new Insets(5));hbox.setAlignment(Pos.CENTER);hbox.getChildren().addAll(new Text("状态信息01"), new Text("状态信息02"), new Text("状态信息03"));        vbox.getChildren().addAll(new Separator(), hbox);return vbox;}private StackPane getCenterPane(){StackPane stackPane = new StackPane();stackPane.setAlignment(Pos.CENTER);Rectangle rec = new Rectangle(200, 200);rec.setFill(Color.DODGERBLUE);rec.widthProperty().bind(stackPane.widthProperty().subtract(50));rec.heightProperty().bind(stackPane.heightProperty().subtract(50));stackPane.getChildren().addAll(rec);return stackPane;}public static void main(String[] args){Application.launch(args);} }

例程的演示页面:
在这里插入图片描述

(四) HBox面板
HBox采用的布局管理器,我称其为行式布局管理器,这种布局管理器是对AWT的FlowLayout做了一些限制,它将所有的控件放在同一行,各控件横向布置,无论有多少个控件都是放在同一行,不允许换行。而AWT的FlowLayout布局管理器当一行放不下时是允许换行的。
HBox面板测试例程:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class PaneTest extends Application {public static Pane FlowPaneTest() {FlowPane pane = new FlowPane();pane.setPadding(new Insets(11, 12, 13, 14));//设置控件之间的垂直间隔距离pane.setHgap(5);//设置控件之间的水平间隔距离pane.setVgap(5);Label lbName = new Label("姓名:");TextField tfName = new TextField();Label lbPassword = new Label("密码:");TextField tfPassword = new TextField();   Button okbtn = new Button("递交");pane.getChildren().addAll(lbName,tfName,lbPassword,tfPassword,okbtn);return pane;}public Pane GridPaneTest() {GridPane pane = new GridPane();pane.setAlignment(Pos.CENTER);pane.setPadding(new Insets(11.5, 12.5, 13.5, 14.5));pane.setHgap(5.5);pane.setVgap(5.5);pane.add(new Button("按钮A"), 0, 0);pane.add(new Button("按钮B"), 1, 0);pane.add(new Button("按钮C"), 0, 1);pane.add(new Button("按钮D"), 1, 1);pane.add(new Button("按钮E"), 0, 2);pane.add(new Button("按钮F"), 1, 2);return pane;}public Pane HBoxTest() {HBox pane = new HBox(15);pane.setPadding(new Insets(15, 15, 15, 15));pane.setStyle("-fx-background-color: blue");pane.getChildren().add(new Button("按钮A"));pane.getChildren().add(new Button("按钮B"));pane.getChildren().add(new Button("按钮C"));pane.getChildren().add(new Button("按钮D"));pane.getChildren().add(new Button("按钮E"));pane.getChildren().add(new Button("按钮F"));return pane;}@Overridepublic void start(Stage stage) {//Pane pane = FlowPaneTest();//Pane pane = GridPaneTest();Pane pane = HBoxTest();// 创建场景Scene scene = new Scene(pane, 320, 150);// 设置舞台stage.setScene(scene);stage.setTitle("JavaFX面板演示");stage.show();}public static void main(String[] args) {launch(args);}
}

例程测试效果图:
在这里插入图片描述
当框架窗口足够宽时,显示效果如下 :
在这里插入图片描述
当框架窗口宽度不足以显示所有组件时,绝不换行显示,超出窗体部分不可见。其显示效果如下 :
在这里插入图片描述

(五) VBox面板

VBox的布局策略与HBox有些类似,不过VBox是将所有的控件放在同一列,各控件纵向布置。

不同面板的布局策略各有特点,在应用开发中,可以根据实际需求选取合适的面板进行布局。很多情形可能需要将多种不同类型的面板组合起来使用,才能符合需求效果。

JavaFx 2.0 还可用Java编程实现音频和视频播放器,下一篇博客:
【多媒体】Java实现MP4和MP3音视频播放器【JavaFX】【音视频播放】

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

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

相关文章

强强联合 | 人大金仓携手中国一汽引领国产数据库行业新浪潮

在国产化政策的推动下&#xff0c;人大金仓携手中国一汽联合开发更贴近汽车产业特定需求的数据库功能和组件。从2023年2月至今&#xff0c;人大金仓已累计部署690套数据库&#xff0c;适配应用系统170个&#xff0c;支撑中国一汽20多个核心系统和重要系统。目前&#xff0c;中国…

Okhttp hostnameVerifier详解

hostnameVerifier 方法简介核心原理参考资料 方法简介 本篇博文以Okhttp 4.6.0来解析hostnameVerfier的作用&#xff0c;顾名思义&#xff0c;该方法的主要作用就是鉴定hostnname的合法性。Okhttp在初始化的时候我们可以自己配置hostnameVerfier&#xff1a; new OkHttpClien…

计算机网络——数据链路层(以太网)

目录 局域网的数据链路层 局域网可按照网络拓扑分类 局域网与共享信道 以太网的两个主要标准 适配器与mac地址 适配器的组成与运作 MAC地址 MAC地址的详细介绍 局域网的mac地址格式 mac地址的发送顺序 单播、多播&#xff0c;广播mac地址 mac帧 如何取用…

YOLOX算法实现血细胞检测

原文:YOLOX算法实现血细胞检测 - 知乎 (zhihu.com) 目标检测一直是计算机视觉中比较热门的研究领域。本文将使用一个非常酷且有用的数据集来实现YOLOX算法,这些数据集具有潜在的真实应用场景。 问题陈述 数据来源于医疗相关数据集,目的是解决血细胞检测问题。任务是通过显微…

Linux基础指令及mysql(DQL)

[rootcentos ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/export/server/jdk/bin:/root/binls在/usr/bin/路径下 [rootcentos ~]# which ls alias lsls --colorauto/usr/bin/lschmod ux,gx,o-r work.txt 可以对文件的权限进行修改。 sudo chown 修…

Python从入门到放弃——整数类型变量

变量 前言 上一篇文章中我们学习了Print函数&#xff0c;并且深入的理解了Print函数的各个参数。明确了应该如何利用各种参数来实现我们想输出的效果。那么现在让我们来学习一下变量这一个知识点。 什么是变量 变量&#xff0c;作为编程中的核心概念之一&#xff0c;其重要性…

STM32和DHT11使用显示温湿度度(代码理解)+单总线协议

基于STM32CT&#xff0c;利用DHT11采集温湿度数据&#xff0c;在OLED上显示。一定要阅读DHT11数据手册。 1、 DHT11温湿度传感器 引脚说明 1、VDD 供电3.3&#xff5e;5.5V DC 2、DATA 串行数据&#xff0c;单总线 3、NC 空脚 4、GND 接地&#xff0c;电源负极 硬件电路 微…

docker部署kafka(单节点) + Springboot集成kafka

环境&#xff1a; 操作系统&#xff1a;win10 Docker&#xff1a;Docker Desktop 4.21.1 (114176)、Docker Engine v24.0.2 SpringBoot&#xff1a;2.7.15 步骤1&#xff1a;创建网络&#xff1a; docker network create --subnet172.18.0.0/16 net-kafka 步骤2&#xff1a;安…

秋招突击——7/4——复习{}——新作{最长公共子序列、编辑距离、买股票最佳时机、跳跃游戏}

文章目录 引言复习新作1143-最长公共子序列个人实现 参考实现编辑距离个人实现参考实现 贪心——买股票的最佳时机个人实现参考实现 贪心——55-跳跃游戏个人实现参考做法 总结 引言 昨天主要是面试&#xff0c;然后剩下的时间都是用来对面试中不会的东西进行查漏补缺&#xff…

MySQL 9.0 创新版发布,大失所望。。

大家好&#xff0c;我是程序员鱼皮。2024 年 7 月 1 日&#xff0c;MySQL 发布了 9.0 创新版本。区别于我们大多数开发者常用的 LTS&#xff08;Long-Term Support&#xff09;长期支持版本&#xff0c;创新版本的发布会更频繁、会更快地推出新的特性和变更&#xff0c;可以理解…

python库(5):Psutil库实现系统和硬件监控工具

1 psutil简介 psutil&#xff08;process and system utilities&#xff09;是一个跨平台库&#xff0c;用于检索运行中进程和系统利用率&#xff08;包括 CPU、内存、磁盘、网络等&#xff09;的信息&#xff0c;可以提供丰富的系统监控功能。 2 psutil安装 pip install -i …

CSS中 实现四角边框效果

效果图 关键代码 border-radius:10rpx ;background: linear-gradient(#fff, #fff) left top,linear-gradient(#fff, #fff) left top,linear-gradient(#fff, #fff) right top,linear-gradient(#fff, #fff) right top,linear-gradient(#fff, #fff) left bottom,linear-gradient(…

BeikeShop多国语言多货币商城系统源码基于Laravel框架

BeikeShop是基于 Laravel 开发的一款开源商城系统&#xff0c;支持多语言商城 多货币商城 100%全开源 ChatGPT OpenAI B2C商城系统 H5商城 PHP商城系统 商城源码 PC商城 跨境电商系统 跨境商城系统 电商商城系统 Laravel 10 框架开发系统&#xff0c;支持插件市场。 Event 机制…

配置基于不同端口的虚拟主机

更改配置文件&#xff0c;添加三个不同端口的虚拟主机 <directory /www> allowoverride none require all granted </directory><virtualhost 192.168.209.136:80> documentroot /www servername 192.168.209.136 </virtualhost><virtualhost 192.…

74. 搜索二维矩阵【二分法】【C++】

题目描述 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&…

CTF入门知识点

CTF知识点 md5函数 <?php$a 123;echo md5($a,true); ?> 括号中true显示输出二进制 替换成false显示输出十六进制绕过 ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c&#xff0c;这个字符串前几位刚好是 or 6 而 Mysql 刚好又会把 …

【向量数据库|一文全面了解向量数据库的基本概念、原理、算法、选型】

文末有福利&#xff01; 向量数据库的原理和实现&#xff0c;包括向量数据库的基本概念、相似性搜索算法、相似性测量算法、过滤算法和向量数据库的选型等等。向量数据库是崭新的领域&#xff0c;目前大部分向量数据库公司的估值乘着 AI 和 GPT 的东风从而飞速的增长&#xff…

C++ 智能指针使用不当导致内存泄漏问题

shared_ptr相互嵌套导致循环引用 代码示例 #include <iostream> #include <memory> using namespace std;class B;class A { public:std::shared_ptr<B> b_ptr;~A() { std::cout << "A destroyed\n"; } };class B { public:std::shared_pt…

【代码随想录——图论——岛屿问题】

1.岛屿数量 https://kamacoder.com/problempage.php?pid1171 1.1 深度优先搜索 package mainimport "fmt"var direction [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}func main() {var M, N intfmt.Scanln(&N, &M)sea : make([][]int, N)visited : make…

LabVIEW图像分段线性映射

介绍了如何使用LabVIEW对图像进行分段线性映射处理&#xff0c;通过对特定灰度值区间进行不同的线性映射调整&#xff0c;以优化图像的显示效果。案例中详细展示了如何配置和使用LabVIEW中的图像处理工具&#xff0c;包括设置分段区间、计算映射参数和应用映射函数等步骤。 实…