JavaFX开发使用经验

基本概念及框架

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

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

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

  • 开发逻辑
    每个fxml通过在文件中设置属性:fx:controller=“类路径”可以将该fxml文件与类绑定,然后在类中就可以利用注释获得fxml文件中的元素,例如,fxml文件中有:

    @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);
}

你可能感兴趣的:(笔记)