博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaFX开发使用经验
阅读量:3939 次
发布时间:2019-05-23

本文共 3131 字,大约阅读时间需要 10 分钟。

基本概念及框架

  • JavaFX界面组成元素:

    在这里插入图片描述
    –stage:窗口,JavaFX最基本的界面,其他组件都是在此基础上搭建,实际显示效果就是一个可放大、缩小、关闭的弹窗。
    –scene:场景,在stage基础上进行显示,需要与Pane进行绑定
    –pane:布局,用来定义scene中元素的布局形式,与scene绑定,并且实际开发中一般与fxml文件一一对应,即一个xml文件会有一个对应的pane
    –node:即界面元素,包括文本框、按钮等,均可以在fxml文件中定义。

    以上便是一个JavaFX页面的层级关系。

  • fxml文件:

    一个资源文件,该文件直接定义了每个JavaFX界面的内容、大小等。
    开发工具:Scene Builder,该工具可以直接打开fxml文件,实时展示其显示效果,并调整,相较于编写fxml文件更容易得到反馈,idea自带也可下载软件(idea自带体验不佳,最新版本idea已优化,但不知实际效果如何)。
    请添加图片描述

  • 开发逻辑

    每个fxml通过在文件中设置属性:fx:controller=“类路径”可以将该fxml文件与类绑定,然后在类中就可以利用注释获得fxml文件中的元素,例如,fxml文件中有:<Button fx:id="confirm" />
    在类中,可以这样使用:

@FXML    private Button confirm;    confirm.setText("按钮名")

如上代码,在fxml或类中都可以获得元素。

fxml文件直接对应view层,而JavaFX这种fxml与类的绑定方式,简直是为MVVM模式量身定做,即view层与ViewModel层双向绑定。

那么stage、scene、pane呢?接着往下看。

首先看一个hellword级的的JavaFX应用程序的代码:

public class HelloWord extends Application {
//start方法,默认方法,包含stage参数 @Override public void start(Stage stage) throws Exception {
//加载fxml文件 Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); //创建scene并将scene与root绑定,并设置窗口大小 Scene scene = new Scene(root,600,400); //将scene放入stage stage.setScene(scene); //显示出来 stage.show(); } //main方法,程序的入口 public static void main(String[] args) {
launch(args); } }

最基本的逻辑就是这样!

详细介绍:

  • stage:
    javaFX通过Stage提供了窗体的一些控制功能,提供了诸如设置窗体大小、全屏、全屏快捷键设置、聚焦、保持最上方,显示,隐藏等等常见的窗体功能。
    Stage只有在JavaFX Application线程中才能够得到并且进行控制,查看了javaFX的源码,发现JavaFX对窗体控制进行了线程检查,只允许JavaFX Application线程进行控制,其他线程是无法对javaFX的窗体进行控制和调用,所以要改变默认的Stage属性,则需要在Application类中定义Stage属性并修改。
    启动一个stage会启动3个线程:启动器线程,JavaFX渲染线程和JavaFX Application线程

scene:场景必须在窗体Stage初始化后才能创建,并且只有在javaFX launcher线程的 init()方法和javaFX Application线程中才能进行创建,其他线程会抛出异常。

  • pane:javafx.scnen.layout.Pane类是其它控件布局的父类,可以将Pane看成一个绝对布局控件,当我们将某个控件放置在Pane当中时,需要指定它的位置(layoutX、layoutY),而当我们将几个控件拖拽到Pane中会自动生成layoutX、layoutY
    继承关系:
    java.lang.Object
    javafx.scene.Node
    javafx.scene.Parent
    javafx.scene.layout.Region
    javafx.scene.layout.Pane

pan类提供了多种子类来定义不同的布局方式:

BorderPane
BorderPane提供了五个放置结点的区域:top、bottom、left、right、和 center;这些区域的大小是自定义的,你可以不定义它,BorderPane就不回给该区域分配空间
默认情况下,如果窗口比所有区域所需空间还大,多余的空间将被分配给中间区域;如果窗口比所需空间小,区域可能会重叠;重叠是由区域设置的顺序决定的

StackPane

控件可以堆叠,且默认都是居中

HBox

HBox是将所有的控件放在同一行,无论有多少个控件都是放在同一行。

VBox

VBox的布局策略与HBox类似,不过VBox是将所有的控件放在同一列。

FlowPane

按照控件的添加次序按个摆放,按照从上到下、从左到右的次序摆放。当舞台的大小发生变化后,场景的大小也自动跟着变化,面板的大小也跟着变化,并且会重新计算各个控件的位置,重新摆放各个控件的位置。

GridPane

将整个面板划分为若干个格子,每个格子的大小是一样的,每个格子中可以放置一个控件,类似于表格的方式。

所有Node在scene中类似于树的形式存在,pane为根节点(pane的根节点是scene),其中pane中有一个常用的方法,getChildren()

protected ObservableList getChildren() {
return children;
}
利用该方法可以得到node列表。

页面切换:

对于比较简单的情况,比如只有两三个页面的切换,可以直接在start()方法中新建多个scene,根据不同事件,将不同scene放入stage即可。

对于比较复杂的情况,可以利用一个中间Pane类,该类本身不对应fxml文件,即没有任何与显示有关的内容,只是作为调节不同页面的出现与隐藏。需要注意的是,该类和主页面对应的Pane应该在主类start()方法中利用getChildren().addAll()方法一同添加。

该中间调节类应包含两个关键方法:

将要显示页面的Page类作为形参传入,利用该方法进行显示:

public void showModalMessage(Region region){
this.getChildren().add(region); //后续代码就可以对region进行位置等属性进行设置}

该方法进行隐藏页面:

public void hideModalMessage(Region region) {
final ModalDimmerPane pane = this; pane.getChildren().remove(region);}

转载地址:http://arzwi.baihongyu.com/

你可能感兴趣的文章
理解测试策略
查看>>
机器学习界大牛林达华推荐的书籍
查看>>
path变量备份
查看>>
Lesson2.2 & 2.3 Maya command reference & quick help
查看>>
lesson 2.4 - Converting MEL Commands to Python
查看>>
Lesson3.2 variables
查看>>
3.4.2 - Operators & 3.4.3 division and truncation
查看>>
3.7.1 - Strings
查看>>
3.7.4 - Indexing and Slicing Strings
查看>>
3.7.5 - Modifying Strings
查看>>
3.7.6 - String Methods
查看>>
3.8 - Using the Print Function
查看>>
3.9.1 - Lists in Python
查看>>
3.9.2 - Lists - Adding and Removing Objects
查看>>
3.9.3 - Sorting Lists
查看>>
3.10 - Maya Commands: ls
查看>>
3.11 - Dictionaries in Python
查看>>
3.12 - Tuples in Python
查看>>
4.4 - For Loops
查看>>
4.2.2 - Logical and/or Operators
查看>>