本文共 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); } }
最基本的逻辑就是这样!
scene:场景必须在窗体Stage初始化后才能创建,并且只有在javaFX launcher线程的 init()方法和javaFX Application线程中才能进行创建,其他线程会抛出异常。
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/