写在前面
上一节介绍了整个系统的主要功能,并使用工具类实现了这些功能。后面就会介绍界面的设计。主要是JavaFX的项目结构。这一节会介绍JavaFX的结构和主界面的设计
JavaFX项目结构
JavaFX项目的基础结构,这是一个新建的项目结构。一共有三个基本的文件。Main文件是整个应用程序的入口,sample.fxml是主界面的设计编码,Controller是sample的一个处理类,相当于你在sample里面定义的一些属性和点击事件方法,在Controller里面定义这些属性定义的事件逻辑。
sample,fxml里面有一个fx:controller是绑定一个控制器的,就是之前上面的Controller。每一个界面对应着一个自己的Controller
基本的结构我是这样设计的,一个controller包界面存放的是每一个界面对用的controller,用一个为view的包作为fxml文件的存放位置,里面都是界面的设计代码。类似这样的
二、界面开发工具的配置
因为界面是使用fxml文件写的,一般不需要我们自己去书写代码,只需要在Scene Builder上把界面设计好,使用它自带的自动生成代码就可以。
现进入官网下载对应的环境,选择自己电脑所对应的版本,直接安装就可以了。
安装后之后就会有一个类似的软件,不需要打开它,可以直接使用idea里面打开
然后我们就新建一个LoginFrame.fxml文件进行登陆主界面,然后右击选择在Scene Builder中打开
打开之后是一个类似于画板,直接进行拖拉选择需要的组件就可以了。
这个部分可以自己看一下组件是怎么调的,这个非常的简单,我就不多叙述了。
三、主界面的设计
因为为了简单,我直接将主界面设置为登陆的界面,有用户名、密码和选择对应的身份为主要元素,2个按钮,一个是登陆,另一个是重置。
每一个Label和Button等组件都可以设置一个自己的id,这是为了在controller可以找到并使用该属性。
比如Label等
<Label fx:id="userNameLabel" prefHeight="40.0" prefWidth="89.0" text="用户名:" />
<TextField fx:id="username" />
绑定对应的事件使用onAction="#loginEvent" 后面事件名称是在controller中定义的函数
<Button fx:id="login" mnemonicParsing="false" onAction="#loginEvent" prefHeight="40.0" prefWidth="90.0" text="登陆">
基本上使用fxml需要用到的就是fx:id、onAction这2个属性,前一个是标记每一个组件的名称,你可以根据名称去操作他们,后一个是事件,触发对应的操作。
我会根据一个具体的功能来介绍怎么去编写这类程序,后面的具体功能都是差不多的,就不啰嗦了。
三、登陆界面的设计
首先我们需要在Main函数里面定义一个主界面。
private Stage primaryStage;
@Override
public void start(Stage primaryStage) throws Exception{
this.primaryStage = primaryStage;
primaryStage.setTitle("学生管理系统");
initLoginFrame();
}
这个界面本来只会弹出一个白色的框体,但是定义一个initLoginFrame();函数来获得登陆的界面。下面介绍一下这个函数的编写。先初始化一个FXMLLoader,使用这个可以加载fxml的文件,然后使用他的setLocation方法设置该页面的fxml文件,就相当于设置了这个界面。在使用load()方法加载,后面就是设置一些基础的属性,然后获取到这个界面的controller,将stage作为参数传递到控制器中,最后用show方法显示出来就可以了。
/**
* 登陆界面
* @throws IOException
*/
private void initLoginFrame() throws IOException {
// 加载登录界面的fxml文件
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/LoginFrame.fxml"));
AnchorPane root = loader.load();
Scene scene = new Scene(root, 1000, 600);
primaryStage.setTitle("登录");
primaryStage.setScene(scene);
primaryStage.setResizable(false);
// 获取登录界面的控制器类
LoginController loginController = loader.getController();
// 将stage作为参数传递到控制器中
loginController.setStage(primaryStage);
// 展示舞台
primaryStage.show();
}
然后就创建我们刚才设定的fxml的文件是在view/LoginFrame.fxml下,具体代码如下:
基本上大部分的代码都是自动根据scene buider自动生成。
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.text.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="600.0" prefWidth="1000.0" GridPane.rowIndex="1" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="studentSystem.controller.LoginController">
<children>
<VBox layoutX="151.0" layoutY="-2.0" prefHeight="600.0" prefWidth="693.0">
<children>
<HBox alignment="CENTER" prefHeight="173.0" prefWidth="693.0">
<children>
<Label fx:id="systemName" alignment="CENTER" prefHeight="97.0" prefWidth="502.0" text=" 学生管理系统" textAlignment="JUSTIFY">
<font>
<Font name="System Bold" size="50.0" />
</font>
</Label>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="87.0" prefWidth="693.0">
<children>
<Label fx:id="userNameLabel" prefHeight="40.0" prefWidth="89.0" text="用户名:" />
<TextField fx:id="username" />
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="76.0" prefWidth="693.0">
<children>
<Label fx:id="passwordLabel" prefHeight="40.0" prefWidth="90.0" text="密码:" />
<PasswordField fx:id="password" />
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="62.0" prefWidth="693.0">
<children>
<Label fx:id="identityLabel" prefHeight="37.0" prefWidth="66.0" text="身份:">
<HBox.margin>
<Insets right="20.0" />
</HBox.margin></Label>
<ComboBox fx:id="comboBox" prefWidth="150.0" promptText="请选择">
<HBox.margin>
<Insets left="10.0" />
</HBox.margin></ComboBox>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="116.0" prefWidth="693.0">
<children>
<Button fx:id="login" mnemonicParsing="false" onAction="#loginEvent" prefHeight="40.0" prefWidth="90.0" text="登陆">
<HBox.margin>
<Insets right="20.0