`
iaiai
  • 浏览: 2197986 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javaFX的几个新特性,让swing彻底过时

    博客分类:
  • J2EE
 
阅读更多
首先声明,Java的GUI曾经是最弱的一环,毋庸置疑,而且历史上因为跟M$的斗争,导致Java失去了Desktop发展的最佳时间点,即便后来SUN&Oracle推出了JavaFX,Desktop市场整体也在走下坡路,挨踢世界已经转入移动互联网时代,Desktop已不再是市场的热点,所以JavaFX几乎不可能像Android&IOS火爆,对此Java&JavaFX程序猿们应该有一个清醒的认识,但是不管怎样,桌面端软件是全栈中不可忽视的一环,虽然不那么重要,但是不能少了它。

下面介绍一下JavaFX的几个特性,这些特性的特点就是上手极为简单,不需要投入多少时间,一个普通的Java程序猿就能上手开发JavaFX的应用。

特性一:绑定Binding

JavaFX新增了Property类,比如DoubleProperty,IntegerProperty etc.,而且所有控件都有Property,区别于普通的Java属性,比如int, double属性。区别在于Property属性可以绑定,在UI线程刷新控件的时候,会自动读取Property属性所绑定的对应属性的值,而不用用户实现并发更新等操作,这么说有些拗口,等下举个例子就明白了,先说特性二。

特性二:Group类

Group是一个Swing中所没有的容器,用过Swing的都知道,Swing的控件容器是各种Pane,which特别难用,新手很容易迷失在BorderPane还是FlowPane的教条使用中。说白了就是搞了半天还是不会用,鬼知道那些API是做啥用的,哥当年学Java的时候,就特别讨厌教程里面的Swing部分,造成的恶果就是工作之后再也不想碰Java的GUI,当然后来阴差阳错,还是去救了一阵的火,但并不改变我对Swing以及各种Pane的看法,两个字就是:难用。好在JavaFX提供给了我们一个新的选择Group。

Group就是一个可以通过坐标设置控件位置的容器,而且控件和控件之间可以重叠,比如我们把两个控件的layoutX以及layoutY坐标都设置为0,那么这两个控件都会在Group的左上角出现,同时会重叠,所以这就让我们在编程的时候,可以针对某一个控件做调整,是不是很方便呢?在Group里的控件,有以下四个属性需要了解,分别是layoutX,layoutY,width,height,分别是控件左上角的x坐标,y坐标,宽度和高度。都是Property属性,我们可以将其绑定到任意一个其他Property属性中去,是不是超级方便啊?下面说个例子,比如我们有两个按钮,button0和button1,我们想在屏幕右下角,也就是高2/3,宽2/3处显示我们的第一个按钮,同时要在左下角,也就是宽1/3,高2/3处显示第二个按钮,同时设置两个按钮的宽度为窗口宽度的10%,这种需求是不是看上去非常无理啊?但是用Group类和按钮的上述四个Property就可以超级容易滴实现这一点,代码如下:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
 
public class Main extends Application {
 
    @Override
    public void start(Stage primaryStage) throws Exception{
//        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
 
        Stage stage = new Stage();
        Group group = new Group();
        stage.setTitle("Example");
        stage.setScene(new Scene(group, 300, 275));
        stage.show();
 
        Button button0 = new Button("button0");
        Button button1 = new Button("button1");
        group.getChildren().addAll(button0,button1);
 
        //注意,高潮来了
        button0.layoutXProperty().bind(stage.widthProperty().multiply(2).divide(3));
        button0.layoutYProperty().bind(stage.heightProperty().multiply(2).divide(3));
        button0.prefWidthProperty().bind(stage.widthProperty().multiply(.1));
 
        button1.layoutXProperty().bind(stage.widthProperty().multiply(1).divide(3));
        button1.layoutYProperty().bind(stage.heightProperty().multiply(2).divide(3));
        button1.prefWidthProperty().bind(stage.widthProperty().multiply(.1));
    }
 
    public static void main(String[] args) {
        launch(args);
    }
}

嗯,这个是普通的Java类,带有一个main函数,在IDE中运行该main函数,之后就会看到:

嗯,按钮因为太窄了,所以上面的字变成了点点点,拖动将其拉宽:

诶,按钮的宽度始终是窗口宽度的10%哦,嗯,这样是不是很方便呢?

不过聪慧的你也许看到了,按钮主体并不在1/3和2/3处居中对齐,而是左上角的点位于该处,嗯,那该如何将按钮的中心点对准我们要的点呢?留作思考题,文章最后会给你答案。知道了这么好用的Group以及x,y,width和height四个属性,是不是所有控件的摆放都能被你轻松搞定呢?

下面继续说其他特性。

特性三:CSS支持

JavaFX还可以使用FXML来绘制控件的位置,类似于网页里面的HTML技术,都是ML(markup language置标语言)嘛,但是同时JavaFX还支持CSS哦,跟网页里面的CSS并无太多不同,只是在属性前面要加上-fx-前缀,这样我们就可以很容易滴邀请网页的美术人员帮我们来美化我们的控件啦。

同时我们需要一个工具,来告诉我们,各个控件的CSS属性都是啥,这就是伟大好用的Scenic View,打开你的JavaFX界面,同时打开Scenic View,后者就能显示出来每一个控件对应的CSS属性以及其他属性,是不是超级方便呢?

特性四:Lambda

这个其实是Java自身的特性,传统我们在Swing控件中写事件,我们需要用匿名内部类,但是现在可以用Lambda啦,用一个简单的匿名函数便可,例如我们想点击button0之后在控制台打出hello world:
button0.setOnMouseClicked(value -> System.out.println("hello world"));

一行搞定,是不是很舒服呢?当然这个Swing也能做得到。

特性五:Native Compiling

之前很多人在做Java程序的时候,都觉得提供给客户是一个大问题,因为要求客户装JRE,不太现实,现在好了,JavaFX提供了将jar和jre打包成DMG以及EXE这些针对某个平台绿色包装的功能,是不是超级方便呢?你可以把你的JavaFX程序直接打包成EXE或者DMG然后发给用Windows或者MacOSX的朋友或者客户,他们双击之后就可以运行了,而无需安装Java或者JRE或者JDK之类的鬼东西,是不是很爽呢?

好公布文中答案,直接减去按钮的宽度和高度的二分之一不就好了?
button0.layoutXProperty().bind(stage.widthProperty().multiply(2).divide(3).subtract(button0.widthProperty().divide(2)));
button0.layoutYProperty().bind(stage.heightProperty().multiply(2).divide(3).subtract(button0.heightProperty().divide(2)));
button0.prefWidthProperty().bind(stage.widthProperty().multiply(.1));
 
button1.layoutXProperty().bind(stage.widthProperty().multiply(1).divide(3).subtract(button1.widthProperty().divide(2)));
button1.layoutYProperty().bind(stage.heightProperty().multiply(2).divide(3).subtract(button1.heightProperty().divide(2)));
button1.prefWidthProperty().bind(stage.widthProperty().multiply(.1));

有了这些功能,你还需要Swing吗?
分享到:
评论

相关推荐

    java Swing 中调用摄像头拍照源码(有说明)

    - JMF已经有些过时,对于新项目,开发者可能会选择使用JavaFX,因为它提供了更好的性能和更多的特性,且更容易跨平台。 - 许可问题:确保你对使用的任何第三方库(如JMF)有正确的许可和授权。 7. **代码实现步骤...

    JavaFX in action ch1

    JavaFX 代表了图形编程的一个新方向,它不仅解决了传统图形编程中的许多问题,还为开发者提供了创建现代、高性能图形界面的能力。无论是对于初学者还是经验丰富的开发者来说,JavaFX 都是一个值得探索的强大工具。...

    java-8.zip

    本压缩包"java-8.zip"包含了几个基于Java 8的可视化实例,这些实例可以帮助学习者深入理解Java 8的新特性和可视化编程技巧。 首先,我们来讨论Java 8中的主要新特性: 1. **Lambda表达式**:这是Java 8最具革命性...

    java计算机课程毕业设计学习源代码day14.7z

    这个毕业设计项目提供了关于Java MIDI编程的实际示例,对于学习者来说,可以从以下几个方面获取知识: - **Java编程基础**:理解类的设计、对象的创建和方法的调用。 - **MIDI API**:学习如何使用Java Sound API中...

    j2se英文帮助文档

    J2SE 6(也称为Java SE 6或Java 6)发布于2006年,引入了许多新特性,如增强的Swing组件、改进的XML支持、动态语言支持(JSR 223)、并发工具类(java.util.concurrent包)以及对JavaFX的初步支持。 在使用这份文档...

    日历 JAVA程序

    在代码组织上,这个日历程序可能包含以下几个类: - `DateChooser`: 主要的GUI组件,可能包含事件处理逻辑。 - `Event`: 用于存储和管理事件的类,可能包含日期、标题、描述等字段。 - `EventCalendar`: 保存事件并...

    jre-7u3-windows-i586.rar

    Java JRE主要包括以下几个核心组件: 1. **Java虚拟机(JVM, Java Virtual Machine)**:JVM是Java程序运行的核心,它负责解释和执行字节码。JRE中的JVM为32位,意味着它只能在同样架构的Windows系统上运行。对于...

    java实训报告(简单人事管理系统的设计与实现).doc

    在本次实训中,我们将利用Java的核心特性,如封装、继承和多态,以及Swing或JavaFX图形用户界面(GUI)库来构建该人事管理系统。 ### 第二章 需求分析 在需求分析阶段,我们明确了以下几点关键需求: 1. **员工...

    Absolute-Java:我从书中复制了几个Java程序

    在Java编程中,掌握以下几个关键知识点至关重要: 1. **基础语法**:Java是一种面向对象的语言,它的基础语法包括数据类型(如int、float、boolean等)、变量声明、运算符、控制流(如if语句、for循环、while循环)...

    java代码学习代码

    在“java代码学校代码”的主题下,我们可以深入探讨以下几个关键知识点: 1. **基础语法**:Java的基础包括变量、数据类型、运算符、控制结构(如if语句、for循环、while循环)、方法定义和调用等。理解这些概念是...

    Bitcamp

    10. **Java 8 及以上的新特性**:如 Lambda 表达式、Stream API 和默认方法,这些新特性极大地简化了代码,提高了生产力。 Bitcamp 的项目可能包含实践练习、小型项目和编程挑战,帮助学习者巩固这些概念并将其应用...

    java-playground:只是另一个java代码

    ))" 这段描述透露了几个关键信息: 1. **java操场**:再次强调这是一个学习和实践Java语言的地方,可能包含各种功能或算法的实现。 2. **对你没用**:可能意味着这个代码仓库对于非作者的其他人来说,可能不具备...

    80外国源码.rar

    Java涵盖了许多子领域,包括核心Java(如集合、多线程、IO流)、网络编程、GUI编程(如Swing、JavaFX)、数据库连接(JDBC)、企业级应用(如Spring框架、EJB)、Web开发(Servlet、JSP)等。因此,这80个源码可能...

    CodeStylePolishing:一日一新问题挑战

    1. **Swing或JavaFX**:用于创建图形用户界面,构建游戏画面。 2. **多线程**:游戏通常需要并发处理多个任务,如游戏循环、用户输入和动画更新。 3. **集合框架**:用于存储和管理游戏对象,如玩家、敌人、物品等...

Global site tag (gtag.js) - Google Analytics