【多媒体】富客户端应用程序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;
	}
	
	
    @Override
    public 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() {
		
	}
	
    @Override
    public 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;
    
    @Override
    public 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;
	}
	
    @Override
    public 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.mfbz.cn/a/769204.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenLayers使用

初学ol&#xff0c;实现了高德地图不同图层的切换、交互性地图飞行以及加载本地JSON数据。 说一下不同图层切换的想法&#xff1a; 1.对于标准地图和卫星地图&#xff1a;二者最初便挂载到map上&#xff0c;两个图层是叠加显示的&#xff1b;当点击按钮时&#xff0c;其实是使…

VSCode里python代码不扩展/级联了的解决办法

如图 解决办法&#xff1a;重新下载新的扩展工具 步骤如下 1、在左边工具栏打开Extensions 2、搜索框输入python&#xff0c;选择别的扩展工具&#xff0c;点击Install - 3在扩展工具所在的目录下&#xff0c;新建一个文件&#xff0c;就可以用了

指定IP地址通过远程桌面访问WINDOWS10

1:登录Windows10系统&#xff0c;在控制面板找到系统和安全&#xff0c;打开Windows Defender防火墙。 2&#xff1a;点击感觉设置。 3&#xff1a;在入站规则中&#xff0c;找到远程桌面。查看自己的网络现在是公用&#xff0c;域&#xff0c;还是专用。选择对应的网络。 4&am…

Oracle EBS PO采购订单预审批状态处理

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: 采购订单状态:预审批 采购订单流程报错如下: po.plsql.PO_DOCUMENT_ACTION_AUTH.approve:90:archive_po not successful - po.plsql.PO_DOCUMENT_ACTION_PVT.do_action:110:unexpected error in acti…

js生成器,迭代器和可迭代对象详解

1.生成器函数和生成器 生成器函数是可以返回一个可迭代对象的特殊函数&#xff0c; 生成器是一个特殊的迭代器&#xff0c; 在js中可以使用function*来定义一个非连续执行的函数作为迭代算法&#xff0c; function* name() {yield value;yield value;yield value; }name: 函…

基于YOLOv5的人脸目标检测

本文是在之前的基于yolov5的人脸关键点检测项目上扩展来的。因为人脸目标检测的效果将直接影响到人脸关键点检测的效果&#xff0c;因此本文主要讲解利用yolov5训练人脸目标检测(关键点检测可以看我人脸关键点检测文章) 基于yolov5的人脸关键点检测&#xff1a;人脸关键点检测…

ROS学习笔记(18):建图与定位(2)

0.前言 上文提到现在的我们已经进入到了SLAM领域的学习&#xff0c;会涉及到大量专业知识&#xff0c;作为一个自学的大三&#xff08;好吧也快大四了&#xff09;萌新并不能保证每次文章的专业性和准确性&#xff0c;所以&#xff0c;本人推荐大家能自己去查阅一些相关书籍和…

TOB传输、承载网拓扑图

1、用户面&#xff1a;GNODEB>UPE>SPE>NPE>UPF>CMNET网 2、控制面&#xff1a;GNODEB>UPE>SPE>NPE>IP承载网>核心网

充分利用智慧校园人事系统,提升党政职务管理

智慧校园人事系统中的党政职务管理功能&#xff0c;是专为高校及教育机构设计的&#xff0c;旨在高效、精确地处理与党政职务相关的各类事务&#xff0c;包括职务任命、任期管理、职责分配、考核评估等&#xff0c;以信息化手段促进党务及行政工作的透明化、规范化。 该模块首先…

redis主从复制哨兵模式集群管理

主从复制&#xff1a; 主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。缺陷&#xff1a;故障恢复无法自动化&#xff1b;写操作无法负载均衡&…

像学Excel 一样学 Pandas系列-创建数据分析维度

嗨&#xff0c;小伙伴们。又到喜闻乐见的Python 数据分析王牌库 Pandas 的学习时间。按照数据分析处理过程&#xff0c;这次轮到了新增维度的部分了。 老样子&#xff0c;我们先来回忆一下&#xff0c;一个完整数据分析的过程&#xff0c;包含哪些部分内容。 其中&#xff0c…

好久不见!写了一个自动截图神器~【附源码】

文章目录 前言新增功能介绍截图功能快捷键设置 程序设计和使用介绍操作菜单栏选择点击坐标点选择图片选择截图区域快捷键设置 表格循环次数状态栏 使用案例源代码 前言 好久没更新文章了。上一次更新是在4月16日差不多&#xff0c;也只是写了一个错误集&#xff0c;没什么太多…

【Python机器学习】模型评估与改进——在模型选择中使用评估指标

我们通常希望&#xff0c;在使用GridSearchCV或cross_val_score进行模型选择时能够使用AUC等指标。scikit-learn提供了一种非常简单的实现方法&#xff0c;那就是scoring参数&#xff0c;它可以同时用于GridSearchCV和cross_val_score。你只需要提供一个字符串&#xff0c;用于…

基于Vue的MOBA类游戏攻略分享平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;Java技术、SpringBoot框架、B/S模式、Vue.js 工具&#xff1a;MyEclipse、MySQL 系统展示 首页 用…

大模型技术在辅助学习中的应用

大模型技术在辅助学习中的应用场景非常广泛&#xff0c;以下是一些典型示例。大模型技术在辅助学习中具有广阔的应用前景&#xff0c;可以为学生提供更加个性化、智能化和高效的学习体验。随着大模型技术的不断发展&#xff0c;我们可以期待在未来看到更多创新应用。北京木奇移…

免费最好用的证件照制作软件,一键换底+老照片修复+图片动漫化,吊打付费!

这款软件真的是阿星用过的&#xff0c;最好用的证件照制作软件&#xff0c;没有之一&#xff01; 我是阿星&#xff0c;今天要给大家安利一款超实用的证件照工具&#xff0c;一键换底&#xff0c;自动排版&#xff0c;免费无广告&#xff0c;让你在家就能轻松搞定证件照&#…

强化学习的数学原理:最优贝尔曼公式

大纲 贝尔曼最优公式是贝尔曼公式的一个特殊情况&#xff0c;但其也非常重要。 本节课很重要的两个概念和一个工具&#xff1a; 工具不用多说&#xff0c;就是贝尔曼最优公式&#xff0c;概念则是 optimal state value&#xff08;最优状态价值&#xff09; 和 optimal polic…

Django开发实战(1)- 认识django

1.django 使用MTV模式&#xff0c;其实与MVC本质一样&#xff1a; model&#xff1a;业务对象和关系映射&#xff08;ORM&#xff09; template&#xff1a;客户端页面展示 view&#xff1a;业务逻辑&#xff0c;根据需求调用 2.开发相关 √ python √ html&…

鸿蒙数据防泄漏(DLP)【Data Loss Prevention Kit开发指导】

Data Loss Prevention Kit开发指导 DLP是系统提供的系统级的数据防泄漏解决方案&#xff0c;提供一种称为DLP的文件格式。后缀格式为“原始文件名&#xff08;包含原始文件后缀&#xff09;.dlp”&#xff0c;例如: “test.docx.dlp”&#xff0c;文件由授权凭证和原始文件密文…

8款你不一定知道的良心软件!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/我们使用一些流行的软件的时候&#xff0c;往往会忽略一些功能非常强大的软件&#xff0c;因为这些软件的众 多&#xff0c;都因为看不见而丢失&a…