虽然Java自诞生之初就推出了AWT,紧接着第二版又推出升级后的Swing,打算在桌面开发这块大展拳脚;可是后来Java在服务器开发上大放异彩,在桌面开发上反而停滞不前,可谓失之J2SE收之J2EE。至于手机开发方向的J2ME,也因为安卓的异军突起而逐渐凋零,尽管安卓开发仍以Java语言为主,但谷歌公司却转去拥抱Kotlin,致使手机端的Java天下岌岌可危。为今之计,既然服务器开发的Java霸主地位牢不可撼,只能在桌面开发这边攻城略地了。不过原先的AWT与Swing实在太古老,难堪大用,唯有另搞一套桌面组件才行。JavaFX便是这些桌面组件中最优秀的一个,原本它要作为插件添加到Eclipse中,然后才能在Eclipse里面编写JavaFX程序。现在Java8的开发包集成了JavaFX,只要Eclipse指定采用Java8来编译,那么无需额外添加其它插件,Java代码即可正常调用JavaFX的内部方法,就像访问AWT与Swing那样。
JavaFX的程序入口与Swing有所不同,它的主程序由Application类派生而来,还要重写派生类的start方法,在该方法中添加具体的界面操作代码。比如下面便是个最简单的JavaFX程序代码:

//演示简单的JavaFX程序
//JavaFX程序的入口类继承自Application
public class TestHello extends Application {public static void main(String[] args) {launch(args); // 启动JavaFX应用,接下来会跳到start方法}@Overridepublic void start(Stage stage) { // 应用程序开始运行stage.setTitle("Hello World"); // 设置舞台的标题Group group = new Group(); // 创建一个小组Scene scene = new Scene(group, 400, 100, Color.WHITE); // 创建一个场景stage.setScene(scene); // 设置舞台的场景stage.setResizable(false); // 设置舞台的尺寸是否允许变化stage.show(); // 显示舞台。相当于JFrame的setVisible(true)}
}

运行上面的测试代码,弹出如下图所示的程序界面,可见窗口左上角的标题为“Hello World”。


看这界面风格,跟AWT和Swing相比没什么区别,还是原来熟悉的味道。只是控件名称都变了,例如:窗口JFrame替换为舞台Stage,面板JPanel替换为场景Scene等等。而窗口大小、窗口背景这些属性也改为由场景指定了,舞台的常用方法只剩下setTitle(设置标题)、setScene(设置场景)、setResizable(是否允许改变舞台尺寸)、show(显示舞台)这些。对于窗口右上角的叉号按钮,JavaFX默认它的单击动作会自动关闭窗口,所以无需单独设置叉号按钮的单击监听器。

除了新来的舞台和场景控件,AWT原先的布局控件也被换成了窗格控件,例如:流式布局FlowLayout替换为流式窗格FlowPane,网格布局GridLayout替换为网格窗格GridPane,边界布局BorderLayout替换为边界窗格BorderPane等等。这三种窗格,除了拥有共同的对齐方式设置方法setAlignment之外,给窗格添加内部控件的方式大相径庭,分别说明如下:
1、若想给流式窗格FlowPane添加控件,则需先调用getChildren方法获得该窗格的节点清单对象,再调用清单对象的add方法,往节点清单中加入新的控件节点。
2、若想给网格窗格GridPane添加控件,则直接调用窗格对象的add方法即可。
3、若想给边界窗格BorderPane添加控件,则要调用不同的方法往五个方位添加控件,这些方法分别是:setTop方法可在窗格的上方添加控件,setBottom方法可在窗格的下方添加控件,setLeft方法可在窗格的左边添加控件,setRight方法可在窗格的右边添加控件,setCenter方法可在窗格的中间位置添加控件。
具体到编码实现上,首先看下面的流式窗格代码片段:

  // 获取采用流式窗格的场景private static Scene getFlowPane() {FlowPane pane = new FlowPane(); // 创建一个流式窗格pane.setAlignment(Pos.CENTER_LEFT); // 设置对齐方式为靠左对齐// pane.setHgap(20); // 设置水平方向上的空白距离// pane.setVgap(50); // 设置垂直方向上的空白距离pane.getChildren().add(new Button("第一个按钮")); // 在窗格上添加一个按钮pane.getChildren().add(new Button("第二个按钮")); // 在窗格上添加一个按钮pane.getChildren().add(new Button("第三个按钮")); // 在窗格上添加一个按钮pane.getChildren().add(new Button("第四个按钮")); // 在窗格上添加一个按钮pane.getChildren().add(new Button("第五个按钮")); // 在窗格上添加一个按钮Scene scene = new Scene(pane, 400, 150); // 创建一个采用流式窗格的场景return scene;}

运行包含以上代码的JavaFX应用程序,弹出如下图所示的窗口界面,可见五个按钮仍然从左往右排列,一列塞不下了就另起一列。


接着看下面的网格窗格代码片段,准备往五行单列的网格中添加五个按钮:

 // 获取采用网格窗格的场景private static Scene getGridPane() {GridPane pane = new GridPane(); // 创建一个网格窗格pane.setAlignment(Pos.CENTER); // 设置对齐方式为居中对齐pane.add(new Button("第一个按钮"), 1, 0); // 在窗格的第0行第1列添加一个按钮pane.add(new Button("第二个按钮"), 1, 1); // 在窗格的第1行第1列添加一个按钮pane.add(new Button("第三个按钮"), 1, 2); // 在窗格的第2行第1列添加一个按钮pane.add(new Button("第四个按钮"), 1, 3); // 在窗格的第3行第1列添加一个按钮pane.add(new Button("第五个按钮"), 1, 4); // 在窗格的第4行第1列添加一个按钮Scene scene = new Scene(pane, 400, 150); // 创建一个采用网格窗格的场景return scene;}

运行包含以上代码的JavaFX应用程序,弹出如下图所示的窗口界面,可见五个按钮从上往下排列,组成一个五行单列的网格布局。


再来看下面的边界窗格代码片段,分别在上、下、左、右、中间五个位置添加按钮:

  // 获取采用边界窗格的场景private static Scene getBorderPane() {// 放在各方向上的节点,它们的默认对齐方式分别如下:// 上边: Pos.TOP_LEFT,下边: Pos.BOTTOM_LEFT,左边: Pos.TOP_LEFT,右边: Pos.TOP_RIGHT,中央: Pos.CENTERBorderPane pane = new BorderPane(); // 创建一个边界窗格pane.setTop(new Button("上方的按钮")); // 在窗格的上方添加按钮pane.setBottom(new Button("下方的按钮")); // 在窗格的下方添加按钮pane.setLeft(new Button("左边的按钮")); // 在窗格的左边添加按钮pane.setRight(new Button("右边的按钮")); // 在窗格的右边添加按钮pane.setCenter(new Button("中间的按钮")); // 在窗格的中间位置添加按钮Scene scene = new Scene(pane, 400, 150); // 创建一个采用边界窗格的场景return scene;}

运行包含以上代码的JavaFX应用程序,弹出如下图所示的窗口界面,可见五个按钮果然散落到了指定的方位。





更多Java技术文章参见《Java开发笔记(序)章节目录》

转载于:https://www.cnblogs.com/pinlantu/p/11341928.html

Java开发笔记(一百三十六)JavaFX的窗格相关推荐

  1. Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作"字符流I/O",其中字母I代表输 ...

  2. Java开发笔记(五十六)利用枚举类型实现高级常量

    前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...

  3. Android开发笔记(三十六)展示类控件

    View/ViewGroup View是单个视图,所有的控件类都是从它派生出来:而ViewGroup是个视图组织,所有的布局视图类都是从它派生出来.由于View和ViewGroup是基类,因此很少会直 ...

  4. OpenCV开发笔记(三十六):红胖子8分钟带你深入了解缩放与图像金字塔(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  5. Android开发笔记(八十六)几个特殊的类

    接口interface interface是一些功能的集合,但它只定义了对象必须实现的成员,而不包含成员的实现代码,成员的具体代码由实现接口的类提供.Android对接口的使用场景主要有三类:事件监听 ...

  6. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  7. VTK学习笔记(三十六)VTK图像填充

    VTK学习笔记(三十六)VTK图像填充 1.官方示例 2.其他例子 总结 1.官方示例 来自官方示例代码,自己只是添加了理解. 代码: #include <vtkCamera.h> #in ...

  8. Slicer学习笔记(三十六)slicer坐标系

    Slicer学习笔记(三十六)slicer坐标系 1.坐标系统 1.1.世界坐标系 1.2.解剖坐标系 1.3.图像坐标系 1.4.图像变换 1.5.二维示例或计算IJtoLS矩阵 1.6.与其他软件 ...

  9. Android开发笔记(一百三十六)可折叠工具栏布局CollapsingToolbarLayout

    可折叠工具栏布局CollapsingToolbarLayout 上一篇博文< Android开发笔记(一百三十五)应用栏布局AppBarLayout>阐述了如何把Toolbar往上滚动,那 ...

  10. Java开发笔记(五十)几种开放性修饰符

    前面介绍子类继承父类的时候,提到了public(公共)和private(私有)两个修饰符,其中public表示它所修饰的实体是允许外部访问的:而private表示它所修饰的实体不允许外部访问,只能在当 ...

最新文章

  1. “口罩厂”霍尼韦尔搞出的量子计算机,刚刚获得了Nature认可
  2. jdk 1.8 concurrenthashmap扩容原理
  3. Linux和Windows平台 动态库.so和.dll文件的生成
  4. html5杂记(1)
  5. JVM垃圾收集和优化
  6. 赛锐信息:SAP img 文档
  7. 苹果官网买的认证翻新机可靠吗?
  8. 什么是SQL Server TRIM()函数?
  9. 和我一起打造个简单搜索之ElasticSearch入门
  10. python高斯滤波和降噪_高斯滤波详解 附python和matlab高斯滤波代码
  11. 【人工智能】人工智能二——遗传算法的基本概念遗传算法的基本算法(编码群体设定适应度函数选择交叉变异遗传算法步骤)解决带约束的函数优化问题多目标的遗传算法遗传算法的改进算法
  12. 使用n切换node版本
  13. python 惰性属性_python中惰性对象
  14. 7-2 航空公司VIP客户查询 (20分)
  15. 篮球与计算机技术,浅析计算机技术应用对高校篮球教学的作用与影响
  16. lyse-building otp applications
  17. 迎接新时代,维谛技术全面呈献硬核策略
  18. USART向串口助手发送数据(DMA方式)
  19. 教大家如何下载淘宝直播视频回放MP4格式
  20. java手机电池充电代码,android电池管理系统从上层的java到底层驱动的调用(转载)...

热门文章

  1. php 小米路由器_云水日记-捣鼓小米路由器开发版本
  2. jenkins根据已打包的镜像,自动生成正式镜像
  3. golang 生成定单号
  4. JAVA 泛型 入门
  5. [转]输入框对齐问题
  6. Spring框架中constructor-arg与property理解
  7. ubuntu MySQL数据库输入中文乱码 解决方案
  8. jQuery(非插件)制作商城放大镜效果
  9. operation is executing and cannot be enqueued
  10. springboot访问路径添加项目名称、tomcat端口号