Java开发笔记(一百三十六)JavaFX的窗格
虽然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方法
} @Override
public 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.CENTER
BorderPane 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开发笔记(序)章节目录》
Java开发笔记(一百三十六)JavaFX的窗格的更多相关文章
- Java开发笔记(三十六)字符串的常用方法
不管是给字符串赋值,还是对字符串格式化,都属于往字符串填充内容,一旦内容填充完毕,则需开展进一步的处理.譬如一段Word文本,常见的加工操作就有查找.替换.追加.截取等等,按照字符串的处理结果异同,可 ...
- Java开发笔记(三十八)利用正则表达式校验字符串
前面多次提到了正则串.正则表达式,那么正则表达式究竟是符合什么定义的字符串呢?正则表达式是编程语言处理字符串格式的一种逻辑式子,它利用若干保留字符定义了形形色色的匹配规则,从而通过一个式子来覆盖满足了 ...
- Java开发笔记(三十九)日期工具Date
Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间.当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样: // 创建一个新的日期实例,默认保存的 ...
- Java开发笔记(八十六)通过缓冲区读写文件
前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作“字符流I/O”,其中字母I代表输入Input,字母O ...
- Java开发笔记(三十)大小数BigDecimal
前面介绍的BigInteger只能表达任意整数,但不能表达小数,要想表达任意小数,还需专门的大小数类型BigDecimal.如果说设计BigInteger的目的是替代int和long类型,那么设计Bi ...
- Java开发笔记(三十二)字符型与整型相互转化
前面提到字符类型是一种新的变量类型,然而编码实践的过程中却发现,某个具体的字符值居然可以赋值给整型变量!就像下面的例子代码那样,把字符值赋给整型变量,编译器不但没报错,而且还能正常运行! // 字符允 ...
- Java开发笔记(三十四)字符串的赋值及类型转换
不管是基本的char字符型,还是包装字符类型Character,它们的每个变量只能存放一个字符,无法满足对一串字符的加工.为了能够直接操作一连串的字符,Java设计了专门的字符串类型String,该类 ...
- Java开发笔记(三十五)字符串格式化
前面介绍了字符串变量的四种赋值方式,对于简单的赋值来说完全够用了,即便是两个字符串拼接,也只需通过加号把两个目标串连起来即可.但对于复杂的赋值来说就麻烦了,假设现在需要拼接一个很长的字符串,字符串内部 ...
- Java开发笔记(四十六)类的构造方法
前面介绍了如何定义一个简单的类,以及它的成员属性和成员方法,从示例代码可以看到,不管是OrangeSimple还是OrangeMember,都要先利用关键字new创建一个实例,然后才能通过实例名称访问 ...
- Java开发笔记(七十六)如何预防异常的产生
每个程序员都希望自己的程序稳定运行,不要隔三岔五出什么差错,可是程序运行时冒出来的各种异常着实烦人,令人不胜其扰.虽然可以在代码中补上try/catch语句捕捉异常,但毕竟属于事后的补救措施.与其后知 ...
随机推荐
- 导出服务器Oracle数据库为dmp文件
本文链接:https://blog.csdn.net/rensheng_ruxi/article/details/79877267一.前提:本机安装有Oracle客户端,并且是正确安装. 二.导出Or ...
- BZOJ 3689: 异或之 可持久化trie+堆
和超级钢琴几乎是同一道题吧... code: #include <bits/stdc++.h> #define N 200006 #define ll long long #define ...
- hibernate的持久化类、主键生成策略
一.hibernate的持久化类 1.什么是持久化类: 持久化:将数据存储到关系型数据库. 持久化类:与数据库中的数据表建立了某种关系的java类.(持久化类=javabean+映射配置文件) 2.持 ...
- If...else 条件判断和If else嵌套
If(条件表达式){ 如果条件表达式结果为true,执行该处代码. 如果条件表达式结果为false,执行下边代码. }else{ 如果条件表达式结果为false,执行该处代码. } If(条件表达式) ...
- [转]查看 docker 容器使用的资源
作者:sparkdev 出处:http://www.cnblogs.com/sparkdev/ 在容器的使用过程中,如果能及时的掌握容器使用的系统资源,无论对开发还是运维工作都是非常有益的.幸 ...
- JavaScript高级程序编程(一)
第一章 JavaScript简史 20170510 JavaScript 组成部分: 核心(ECMAScript) 文档对象模型(DOM)浏览器对象模型(BOM) Netscape Navigat ...
- 【洛谷P3369】普通平衡树——Splay学习笔记(一)
二叉搜索树(二叉排序树) 概念:一棵树,若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉搜索树 ...
- 【洛谷】P4198 楼房重建(线段树)
传送门 分析 被线段树按在地上摩擦 先把左边转化成斜率,那么这个题就转化成每次修改一个点的值,输出前缀最大值的个数 看到标签是线段树,所以还是想想线段树的做法吧 既然是线段树,那么就要将区间分成两半 ...
- SpringSecurity的简单入门
以下是大体思路 1.导入坐标 <properties> <spring.version>4.2.4.RELEASE</spring.version> </pr ...
- Symfony之入门学习
最近因业务需要,主要针对Edusoho进行二次开发.但是对于Symfony,我并不熟悉,我所了解的是,它的那套与我在Java中常用的开发模式MVC,本质上并不多大差异,就是所使用的语言不一样而已.下面 ...