【多媒体】富客户端应用程序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.rhkb.cn/news/368362.html

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

相关文章

数据结构(一)C语言补

数据结构 内存空间划分 一个进程启动后&#xff0c;会生成4G的内存空间 0~3G是用户空间(应用层) 3~4G是内核空间(底层) 0~3G 3~4G 所有的进程都会共享3G~4G的内核空间&#xff0c; 但是每个进程会独立拥有0~3G的用户空间。 栈区 存放数据特点 栈区存放数据的申请空间的先后…

小学vr虚拟课堂教学课件开发打造信息化教学典范

在信息技术的浪潮中&#xff0c;VR技术正以其独特的魅力与课堂教学深度融合&#xff0c;引领着教育方式的创新与教学方法的变革。这一变革不仅推动了“以教促学”的传统模式向“自主探索”的新型学习方式转变&#xff0c;更为学生带来了全新的学习体验。 运用信息技术融合VR教学…

C++那些事之小项目实战-进程间通信

小项目实战之进程间通信 进程间通信是一个非常重要的话题&#xff0c;特别是像一些大型项目都有它的影子&#xff0c;例如&#xff1a;PostgreSQL使用了管道完成copy的进程间通信&#xff0c;那么本节也将基于这个主题&#xff0c;使用C去搭建一个进程间通过管道通信的demo出来…

【代码随想录】【算法训练营】【第53天】 [739]每日温度 [496]下一个更大元素I [503]下一个更大元素II

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 48&#xff0c;周六&#xff0c;不能再坚持~ 题目详情 [739] 每日温度 题目描述 739 每日温度 解题思路 前提&#xff1a;寻找任一个元素的右边比自己大的元素的位置 思路&#xff1a;通常…

(三十一)Flask之wtforms库【剖析源码下篇】

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

spring boot初始化的几个总结

spring intializr File->New->Project 注意&#xff1a;Spring Initializer中 Java版本选择模块已经不支持1.8了。 Spring Boot 3.x要求 Java最低版本为17&#xff0c; 最新的SpringBoot版本已经要求Java22了 所以&#xff0c;你可以升级Java版本&#xff0c;使用Spri…

6.26.3 基于Transformer的深度神经网络在数字乳腺断层合成图像上的乳腺癌分类

开发一种有效的深度神经网络模型&#xff0c;该模型结合了相邻图像部分的上下文&#xff0c;以检测数字乳腺断层合成(DBT)图像上的乳腺癌。 数字乳房断层合成(DBT)是一种医学成像技术&#xff0c;其中检测器围绕患者以有限角度旋转并记录多幅图像。然后将这些图像重建为二维(2D…

【Python】变量与基本数据类型

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言变量声明变量变量的命名规则 变量赋值多个变量赋值 标准数据类型变量的使用方式存储和访问数据&#xff1a;参与逻辑运算和数学运算在函数间传递数据构建复杂的数据结构 NameE…

关于5G和卫星

手机&#xff0c;已经串联起了我们生活中的一切环节。我们随时随地拿出手机&#xff0c;都能畅快地上网。 这一切是如此地理所当然&#xff0c;以至于我们甚至想不到这样不可思议的问题&#xff1a; 移动通信网络真的无处不在吗&#xff1f; 我们都知道&#xff0c;地球虽叫…

WordPress主题大前端DUX v8.7源码下载

全新&#xff1a;用户注册流程&#xff0c;验证邮箱&#xff0c;设置密码 新增&#xff1a;列表显示小视频和横幅视频 新增&#xff1a;文章内容中的外链全部增加 nofollow 新增&#xff1a;客服功能中的链接添加 nofollow 优化&#xff1a;产品分类的价格显示

Day05-讲师列表前端-讲师信息添加

代码&#xff1a; //添加讲师 addTeacher(teacher){ return request({ url:/eduservice/teacher/addTeacher, method:‘post’, data:teacher }) } &#xff08;2&#xff09;在页面实现调用 代码&#xff1a; 讲师添加 <el-button type“primary” :disabled“sav…

【Qt之·类QVariant·数据类型】

系列文章目录 文章目录 前言一、概述二、操作及用法1.1 存储数据1.2 获取数据1.3 设置数据1.4 数据类型判断1.5 判断数据是否有效 三、实例演示总结 前言 QVariant是Qt开发中非常重要的一部分&#xff0c;它是Qt的一个核心类&#xff0c;用于处理不同数据类型之间的转换和传递。…

Elasticsearch集群部署(下)

目录 上篇&#xff1a;Elasticsearch集群部署&#xff08;上&#xff09;-CSDN博客 七. Filebeat 部署 八. 部署Kafka 九. 集群测试 链接&#xff1a;https://pan.baidu.com/s/1AFXSmDdY5xBb7g35ipKoaw?pwdfa9m 提取码&#xff1a;fa9m 七. Filebeat 部署 为什么用 F…

使用 draw.io 画图

尽管我非常喜欢 wps 和 office 的 ppt 画图&#xff0c;但因为它们对数学公式的糟糕支持&#xff0c;我不得不另外寻找一个画图工具。当然我也同样很喜欢 visio &#xff0c;但同样的&#xff0c;它对数学公式的支持糟糕&#xff0c;另外&#xff0c;最为重要的是&#xff0c;v…

java设计模式(十二)享元模式(Flyweight Pattern)

1、模式介绍&#xff1a; 享元模式是一种结构型设计模式&#xff0c;旨在通过共享对象来有效支持大量细粒度的对象。它通过将对象的状态分为内部状态&#xff08;可共享&#xff09;和外部状态&#xff08;不可共享&#xff09;来减少内存消耗和提高性能。内部状态存储在享元对…

​Chrome插件:React Developer Tools为React开发调试而生

React Developer Tools 是什么? 它是允许在Chrome和Firefox开发者工具中检查React组件层次结构的扩展插件。 插件源码下载 源码下载地址:GitHub - facebook/react-devtools at v3 下载完成以后执行红框中的代码,下载react-devtools 源码,源码如下图所示: 插件打包 当前n…

【软件测试】如何搭建appium工具环境?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、安装Java Development Kit&#xff08;JDK&#xff09; 前往Oracle官网下载JDK。 在https:/…

用Python制作动态钟表:实时显示时间的动画

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame绘制钟表函数主循环 完整代码 引言 动态钟表是一种直观且实用的UI元素&#xff0c;能够实时显示当前时间。在这篇博客中&#xff0c;我们将使用Python创建一个动态钟表&#xff0c;通过利用Pygame库来实…

高校搭建AIGC新媒体实验室,创新新闻教育教学模式

高校作为人才培养的重要阵地&#xff0c;必须紧跟时代步伐&#xff0c;不断创新教育教学模式&#xff0c;提升跨界融合育人水平&#xff0c;通过AIGC新媒体实验室探索创新人才培养模式。AIGC新媒体实验室不仅能够高效赋能高校宣传媒体矩阵&#xff0c;也可以助力教学实践与AIGC…

【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)

文章目录 定义结构Demo | 代码Subject目标类Observer抽象观察者观察者1 | CPU监听器观察者2 | 内存监听器客户端 | Client 优点适合场景 定义 所谓观察者模式就是你是被观察的那个对象&#xff0c;你爸爸妈妈就是观察者&#xff0c;一天24h盯着你&#xff0c;一旦你不听话&…