图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。

JavaFX作为Java新一代的GUI编程框架,受到Java程序员的广泛欢迎。比起上一代的Swing技术,JavaFX功能更强大,编程更简单,构造界面的控件种类更丰富,并且有功能强大的界面设计工具的支持。

下面就来简单地介绍一下JavaFX程序的基本结构,并通过一个具体的例子来做说明。

首先,介绍一下JavaFX程序的基本构成。JavaFX程序作为一种特殊类型的应用程序,它的构成也是特殊的。JavaFX为了方便程序员编写JavaFX程序,特别定义好了一个特殊的类Application,即javafx.application.Application,JavaFX程序中的主类必须从这个类派生出来,并且必须覆盖start方法,这个方法是JavaFX程序的启动方法,由Java虚拟机自动调用。代码如下:

public class MyJavaFX extends Application {

@Override // Override the start method in the Application class

public void start(Stage primaryStage) {

// code here

}

}

start方法的主要作用就是完成程序界面的具体构造,它接受的参数primaryStage是由Java虚拟机自动创建的一个特殊对象,称为主舞台stage,相当于程序的主窗口。我们需要在这个主舞台上完成界面的构造。

首先需要创建一个场景(Scene)对象,然后将场景对象添加到主舞台上,然后再在场景上摆放各种节点Node来构造界面。它们的关系如下图所示:

图中的按钮Button就是控件,控件也是节点的一种,具体的界面主要就是由各种控件来构成,不同的控件有着不同的外观和功能。

Stage(舞台) > Scene(场景) > Pane(面板) > node(节点)

面板的作用:为了更好地构造不同的界面,可以借助各种面板来进行布局。容器类。自动地将节点布局在一个希望的位置和大小。将节点置于一个面板中,然后将面板再置于一个场景中。将节点置于一个面板中,然后将面板再置于一个场景中JavaFX提供了多种面板供我们使用,方便我们进行不同风格的布局。

节点是可视化组件,比如一个形状、一个图像视图、一个UI 组件或者一个面板。

形状是指文字、直线、圆、椭圆、矩形、弧、多边形、折线等。

UI 组件是指标签、按钮、复选框、单选按钮、文本域、文本输入区域等。

Scene 可以包含Control 或者Pane, 但是不能包含Shape 和ImageView。

Pane可以包含Node 的任何子类型。

可以使用构造方法Scene(Parent, width, height)或者SCene(Parent)创建 Scene。后一个构造方法中场景的尺寸将自动确定。

Node的每个子类都有一个无参的构造方法,用于创建一个默认的节点。

下面的例子中使用了HBox 面板,HBox的布局策略是将所有节点摆放在同一排。首先创建了两个Button,代码如下:

Button btOK = new Button("OK");

btOK.setPrefSize(100, 20);//将Button的宽度和高度设置为100和20

Button btCancel = new Button("Cancel");

btCancel.setPrefSize(100, 20); //将Button的宽度和高度设置为100和20

然后创建HBox对象,代码如下:

HBox hbox = new HBox();   //设置控件与 HBox 边缘之间的距离

hbox.setPadding(new Insets(15, 12, 15, 12));

hbox.setSpacing(10);   // 设置节点之间的间隔距离

hbox.setStyle("-fx-background-color: #336699;");//设置背景色

然后将两个Button添加到HBox中,代码如下:

hbox.getChildren().addAll(btOK, btCancel);

然后创建场景Scene对象,将场景对象添加到主舞台上,代码如下:

Scene scene = new Scene(hbox, 200, 250);

primaryStage.setScene(scene);

最后,显示主舞台,代码如下:

import javafx.application.Application;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.stage.Stage;

import javafx.scene.layout.HBox;

import javafx.scene.layout.Pane;

import javafx.scene.layout.StackPane;

import javafx.scene.paint.Color;

import javafx.scene.shape.Circle;

import javafx.geometry.Insets;

public class MyJavaFX extends Application {

@Override // Override the start method in the Application class

public void start(Stage primaryStage) {

// the first stage

HBox hbox = new HBox();

hbox.setPadding(new Insets(15, 12, 15, 12));

hbox.setSpacing(10);

hbox.setStyle("-fx-background-color: #336699;");

Button btOK = new Button("是");

btOK.setPrefSize(100, 20);

Button btCancel = new Button("必须是");

btCancel.setPrefSize(100, 20);

hbox.getChildren().addAll(btOK, btCancel);

Scene scene = new Scene(hbox, 200, 250);

primaryStage.setTitle("yes or no");

primaryStage.setScene(scene);

primaryStage.show();

}

}

注意,如果要编译和运行JavaFX程序,必须安装JDK 8以上的版本。

在窗口内添加一个圆

我们发现,建立了一个200*200的面板,圆的中心坐标位于100*100.

但是当我们拉伸面板的大小时,圆不再居中。------> 引入 属性绑定

Circle circle = new Circle();

circle.setCenterX(100);

circle.setCenterY(100);

circle.setRadius(50);

circle.setStroke(Color.BLUEVIOLET);

circle.setFill(Color.CYAN);

Stage stage = new Stage();

Pane pane = new Pane();

pane.getChildren().add(circle);

Scene scene2 = new Scene(pane,200,200);

stage.setTitle("A circle");

stage.setScene(scene2);

stage.show();

属性绑定

target.bind(source); // bind方法在javafx.beans.property.Property 接口中定义

Pane pane = new Pane();

Circle circle = new Circle();

circle.centerXProperty().bind(pane.widthProperty().divide(2));

circle.centerYProperty().bind(pane.heightProperty().divide(2));

circle.setRadius(50);

circle.setStroke(Color.BLUEVIOLET);

circle.setFill(Color.CYAN);

Stage stage = new Stage();

pane.getChildren().add(circle);

Scene scene2 = new Scene(pane,200,200);

stage.setTitle("A circle");

stage.setScene(scene2);

stage.show();

另一个绑定的小程序

import javafx.beans.property.DoubleProperty;

import javafx.beans.property.SimpleDoubleProperty;

public class BindingDemo {

public static void main(String[] args) {

// TODO Auto-generated method stub

DoubleProperty d1 = new SimpleDoubleProperty(1);

DoubleProperty d2 = new SimpleDoubleProperty(2);

d1.bind(d2);

System.out.println("dl is " + d1.getValue() +" and d2 is" + d2.getValue());

d2.setValue(70.2);

System.out.println("dl is " + d1.getValue() + " and d2 is " + d2.getValue());

}

}

DoubleProperty、FloatProperty、LongProperty、IntegerProperty以及BooleanProperty都是抽象类。它们的具体子类SimpleDoubleProperty、SimpleFloatProperty、SimpleLongProperty、SimplelntegerProperty 以及SimpleBooleanProperty 用于产生这些属性的实例

java属性绑定_java基础:10.1 Java FX与属性绑定相关推荐

  1. java display.getdefault()_java基础(十一 )-----反射——Java高级开发必须懂的

    本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...

  2. java单线程循环调度_Java基础篇之Java线程模型

    原标题:Java基础篇之Java线程模型 Java运行系统在很多方面依赖于线程,所有的类库设计都考虑到多线程.实际上,Java使用线程来使整个环境异步.这有利于通过防止CPU循环的浪费来减少无效部分. ...

  3. java 线程模型_Java基础篇之Java线程模型

    Java运行系统在很多方面依赖于线程,所有的类库设计都考虑到多线程.实际上,Java使用线程来使整个环境异步.这有利于通过防止CPU循环的浪费来减少无效部分. 为更好的理解多线程环境的优势可以将它与它 ...

  4. 深受Java程序员欢迎的10款Java IDE

    概述:Java是全世界最受欢迎的一门程序语言,它被广泛的应用于企业项目.游戏设计.安卓应用程序等开发领域.以下的列表是整理的近些年来深受Java程序员欢迎的10款Java IDE. Java是全世界最 ...

  5. Java编程语言学习:Java语言编程的基础知识之Java的变量与数据类型、符号、运算符、数组Array总结之详细攻略

    Java编程语言学习:Java语言编程的基础知识之Java的变量与数据类型.符号.运算符.数组Array总结之详细攻略 目录 Java语言编程的基础知识之Java的变量与数据类型.符号.运算符.数组总 ...

  6. java super用法_Java基础面试题汇总

    blog.csdn.net/ThinkWon/article/details/104390612 Java概述 何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结 ...

  7. java 抽象类语法_JAVA基础语法8--多态/抽象类/抽象方法

    多态 继承.封装.多态.抽象是面向对象编程的四大基本特征.封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提条件下,改变类的内部结构,同时保护了数据.继承是为了重用父类代码,同时为多态做准备.那 ...

  8. java选填_java基础填空选择题

    Core Java试题 选择填空题:全部为多选题,只有全部正确才能得分. 1. 编译java程序的命令是__B_;运行java程序的命令是____A____;产生java文挡的命令是_____D___ ...

  9. java中立方根方法_java基础:4、java中Math类的常用方法?

    4.java中Math类的常用方法? Java的Math类封装了很多与数学有关的属性和方法.如下所示: System.out.println("计算平方根--Math.sqrt(81)--  ...

  10. java定义构造方法_JAVA基础学习之路(三)类定义及构造方法

    类的定义及使用 一,类的定义 classBook {//定义一个类intprice;//定义一个属性intnum;public static int getMonney(int price, intn ...

最新文章

  1. CSS常见布局解决方案
  2. 一种注册表沙箱的思路、实现——Hook Nt函数
  3. 如何实现自己的机器做服务器
  4. group by用法多个字段_select的用法
  5. ARM交叉编译工具arm-linux-gcc安装
  6. 计算机汉字的输入和编辑教案,计算机汉字录入教案
  7. java 修饰符 访问控制符_《Java基础知识》Java访问修饰符(访问控制符)
  8. select count(*) from返回值_MySQL 优化:count(1)真的比count(*)快吗
  9. 为什么学霸不情愿帮助同学回答问题?
  10. php防撞库,基于单片机的倒车防撞预警系统设计和实现
  11. 计算机设置定时关机win10,win10简单设置定时关机,电脑设置每日定时关机
  12. 车载显示屏刷鸿蒙系统,华为智能品鉴会如期进行,鸿蒙系统车载显示屏首次亮相...
  13. 基于 Nginx 的 HTTPS 性能优化
  14. 定时任务Alarm的深入理解
  15. 基于python的个人博客系统的设计开题报告_基于JavaSSM框架的个人博客系统设计与实现开题报告...
  16. PVE虚拟机开启支持虚拟化
  17. 初识LightGBM
  18. mac terminal终端打开指定文件夹 当前文件夹打开terminal
  19. TS之namespace与module
  20. 日期和时间函数DateAdd

热门文章

  1. windows下快速创建大文件
  2. 一步步实现SDDC-Edge负载均衡
  3. Kubernetes学习总结(12)—— 学习 kubernetes 的10个技巧或建议
  4. Java基础学习总结(121)——Java JVM执行流程
  5. Maven学习总结(35)——Maven项目错误 JAX-RS (REST Web Services) 2.0 can not be installed问题...
  6. 中修改环境变量_系统小技巧:彻底弄懂Windows 10环境变量
  7. 一个宝妈如何完成逆袭做到月入5万+,单品利润破20万的
  8. 宁夏大学新华学院08计算机马宁,公 示
  9. Java工程师学习指南 中级篇
  10. 使用Java制作验证码