当前位置: 首页 > 后端技术 > Java

JavaFx教程(一)基本概念

时间:2023-04-01 14:50:49 Java

今年打算跨出这个领域,做一点桌面开发。在几个桌面开发之间进行了选择,最终选择了JavaFx。原因是这也是在Java中完成的。学习一门语言。JavaFx也有游戏引擎,打算以后自己写一些游戏玩玩。至于JDK版本的选择,我选择了JDK11,很大的原因是JDK有Jlink来裁剪JDK,让最终生成的平台包尽可能的小。javaFx有一个很好的文档:https://fxdocs.github.io/docs...本教程基本就是基于这个文档。阅读本系列教程的前提是具备JavaSE基础,熟练掌握maven。前言进入大学的时候没想到第一门编程语言出来了黑窗,让我很失望,让我一点动力都没有,甚至一度让我很失望。后来又买了一本C语言游戏开发的书,挺有意思的,但是没怎么投入精力。那时候,我的主要精力还是花在了数学上。后来开了个Java课程,其实兴趣不大。翻到课本后面,发现有桌面开发,于是兴奋起来,却发现JavaSwing丑陋不堪:于是放弃了学习的念头但是一个偶然的机会,我发现Java是从JavaFx出来的。看了界面,发现她长得还不错,是个“美少女”,还有游戏引擎。什么是javaFx?JavaFX是一个开源的下一代客户端应用程序平台,适用于基于Java构建的桌面、移动和嵌入式系统。---javaFx官网所以JavaFx是一个应用平台,我们可以使用JavaFx来构建图形应用。从HelloWorld开始,JDK11的安装这里不再赘述。此外,还需要一个Maven原型。让我们按照第一个例子。下面是安装JavaFxarchetypes的脚本:gitclonehttps://github.com/openjfx/javafx-maven-archetypes.gitcdjavafx-maven-archetypesmvncleaninstall#坐标如下GroupId=org.openjfxArtifactId=javafx-archetype-simple稍微说明一下,JDK11已经模块化,不能引入rt包。会出现一个窗口:这个maven模板生成的javaFx的依赖版本是13,我改成了11。让我们解释一下这段代码:publicclassAppextendsApplication{@Overridepublicvoidstart(Stagestage){varjavaVersion=SystemInfo.javaVersion();varjavafxVersion=SystemInfo.javafxVersion();varlabel=newLabel("Hello,JavaFX"+javafxVersion+",runningonJava"+javaVersion+".");varscene=newScene(newStackPane(label),640,480);stage.setScene(场景);舞台表演();}publicstaticvoidmain(String[]args){launch();}publicclassSystemInfo{//获取当前Java版本publicstaticStringjavaVersion(){returnSystem.getProperty("java.version");}//获取javaFx的当前版本publicstaticStringjavafxVersion(){returnSystem.getProperty("javafx.version");}}图的数据结构如下:Stage的意思是舞台,可以理解为JavaFx对当前操作系统窗口的响应Scene有场景的意思,所以更方便的理??解是javaFx的设计者懂桌面开发作为戏剧的表演,戏剧需要一个舞台,而戏剧有不同的场景,不同的场景有不同的布局,在“helloworld”之上d》这个小剧中,我们只在上面放了StackPane,在StackPane上面放了Label,就是一个比较简单的数据结构图。比较通用的有以下几种:直接或间接依附于Scene的元素是统称为SceneGraph,这里我把这个词翻译成场景图,其实看到Graph的时候就想到了数据结构中的图,我觉得这个翻译不太合适,但是找不到好的翻译name,所以我们就用这个翻译名字吧。任何一个JavaFx窗口都可以表示为上面的数据结构,并且在任何给定的时间,一个Stage都可以附加一个Scene。JavaFx中场景图中的所有元素都是Node对象。Node有heel,branch,Ye三种类型,根节点是唯一没有父节点的节点,看到这里可能有同学会问,Scene不就是Node的父节点吗?从数据结构的角度来说,是的,但是Scene本身并不是一个Node对象,我们可以把Scene理解为地球。分支节点和叶节点的区别在于叶节点没有子节点。在场景图中,父节点的很多属性都是子节点共享的。Transformation——Transformations在JavaFxTypes中分为三种类型:translation、scaling、rotation。我们将通过以下示例演示这三种转换:publicclassTransformAppextendsApplication{privateParentcreateContent(){//设置矩形的长宽高Rectanglebox=newRectangle(100,50,Color.BLUE);变换(盒子);返回新窗格(框);}privatevoidtransform(Rectanglebox){//在这里写转换代码,下面只显示这个方法}@Overridepublicvoidstart(StageprimaryStage)throwsException{primaryStage.setScene(newScene(createContent(),300,300,颜色.灰色));primaryStage.show();}publicstaticvoidmain(String[]args){launch(args);}}这个程序在windows上运行效果图如下:TranslateMovement在JavaFx中,节点可以有三维变换(X,YorZ)和二维变换(X,Y),但是我们的示例应用是2D,所以我们只考虑X和Y轴。在JavaFx和计算机图形学中,翻译意味着移动。下面的程序将上部矩形在X轴上平移100像素,在Y轴上平移200像素。代码如下:privatevoidtransform(Rectanglebox){//在这里写转换代码,下面只显示这个方法box.setTranslateX(100);box.setTranslateY(200);}Scalescaling我们可以使用缩放来使节点变大或变小,默认情况下节点在每个轴上缩放1。我们将上面的矩形缩放1.5倍:privatevoidtransform(Rectanglebox){//在这里写变换代码,下面只展示这个方法box.setScaleX(1.5);box.setScaleY(1.5);}效果图:Rotate旋转代码:privatevoidtransform(Rectanglebox){//先平移再旋转,比较明显box.setTranslateX(100);box.setTranslateY(200);//旋转30度box.setRotate(30);}作用:eventProcessing——事件处理事件通知,按字面理解即可,即节点上发生了某个事件通知监听器。举个例子,我们登录系统,输入用户名和密码后,点击登录,相应的监控器就会将你输入的信息发送到服务器。事件通常是事件系统的原语。一般来说,一个事件系统有以下三个职责:触发事件通知给监听事件的监听者处理事件事件通知由javaFx平台自动完成,我们只考虑触发事件、监听事件以及如何处理他们。publicclassEventAppextendsApplication{@Overridepublicvoidstart(StageprimaryStage)throwsException{//创建一个按钮Buttonbutton=newButton("监听点击事件");//监听按钮点击事件,点击按钮输出helloworldbutton.setOnAction(o->{System.out.println("helloworld");});//窗格pane=newPane(button);primaryStage.setScene(新场景(窗格,300,200));primaryStage.show();}}键鼠事件是最常见的,每个Node都有封装好的方法来监听和处理这些事件。写在最后。目前JavaFx的参考资料比较少。我在学习上也有波折。官网的开发者文档真的有点不友好。还好在搜索引擎上搜索JavaFx,找到了很好的参考资料:https://fxdocs.github.io/docs...。但是这个文档对于初学者来说还是不够的。幸运的是,它有一条主线。本文是在这篇文章的基础上,加上自己的理解。