首先创建一个普通的JavaFX项目(创建JavaFX项目可以参考以前的文章),然后按照下图创建文件夹和文件:
其中tools包下的一个类可以直接导入使用,如果有兴趣可以去关注看下,如果没有兴趣,直接使用即可。
package BookManageSystem.tools;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import java.util.Optional;
public class SimpleTools {
/**
* 操作结果:JavaFX设置按钮、标签等组件的图标
*
* @param labeleds 需要设置图标的按钮
* @param imagePaths 图标的路径
*/
public void setLabeledImage(Labeled[] labeleds, String[] imagePaths) {
for (int i = 0; i < labeleds.length; i++) {
labeleds[i].setGraphic(new ImageView(new Image("file:" + imagePaths[i])));
}
}
/**
* 操作结果:清空文本框组件的内容
*
* @param inputControls 文本框或文本域组等
*/
public void clearTextField(TextInputControl... inputControls) {
for (int i = 0; i < inputControls.length; i++) {
inputControls[i].setText("");
}
}
/**
* 操作结果:取消所有单选按钮选择
*
* @param toggleButtons 单选按钮组
*/
public void clearSelectedRadioButton(ToggleButton... toggleButtons) {
for (int i = 0; i < toggleButtons.length; i++) {
toggleButtons[i].setSelected(false);
}
}
/**
* 操作结果:取消所有下拉列表框选择
*
* @param comboBoxes 下拉列表框组
*/
public void clearSelectedComboBox(ComboBox... comboBoxes) {
for (int i = 0; i < comboBoxes.length; i++) {
comboBoxes[i].getSelectionModel().select(-1);// 设置选择的索引为-1,就不会选择任何选择选项了。
}
}
/**
* 操作结果:JavaFX设置菜单项组件的图标
*
* @param menuItems 菜单项
* @param imagePaths 图标的路径
*/
public void setMenuItemImage(MenuItem[] menuItems, String[] imagePaths) {
for (int i = 0; i < menuItems.length; i++) {
menuItems[i].setGraphic(new ImageView(new Image("file:" + imagePaths[i])));
}
}
/**
* 操作结果:JavaFX判断是否为空
*
* @param str 文本
* @return boolean 如果不为空返回true,否则返回false
*/
public boolean isEmpty(String str) {
if (str == null || "".equals(str.trim())) {
return true;
} else {
return false;
}
}
/**
* 操作结果:自定义一个JavaFX的对话框
*
* @param alterType 对话框类型
* @param title 对话框标题
* @param header 对话框头信息
* @param message 对话框显示内容
* @return boolean 如果点击了”确定“那么就返回true,否则返回false
*/
public boolean informationDialog(Alert.AlertType alterType, String title, String header, String message) {
// 按钮部分可以使用预设的也可以像这样自己 new 一个
Alert alert = new Alert(alterType, message, new ButtonType("取消", ButtonBar.ButtonData.CANCEL_CLOSE), new ButtonType("确定", ButtonBar.ButtonData.YES));
// 设置对话框的标题
alert.setTitle(title);
alert.setHeaderText(header);
// showAndWait() 将在对话框消失以前不会执行之后的代码
Optional<ButtonType> buttonType = alert.showAndWait();
// 根据点击结果返回
if (buttonType.get().getButtonData().equals(ButtonBar.ButtonData.YES)) {
return true;// 如果点击了“确定”就返回true
} else {
return false;
}
}
/**
* 操作结果:JavaFX判断是否登录成功
*
* @param userNameTextField 用户名文本框
* @param passwordTextField 密码文本框
* @param userName 正确用户名
* @param password 正确密码
* @return boolean 如果登录成功返回true,否则返回false
*/
public boolean isLogIn(TextInputControl userNameTextField, TextInputControl passwordTextField, String userName, String password) {
SimpleTools simpleTools = new SimpleTools();
if (simpleTools.isEmpty(userNameTextField.getText())) {
simpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "用户名不能为空!");
return false;
}
if (simpleTools.isEmpty(passwordTextField.getText())) {
simpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "密码不能为空!");
return false;
}
if (!userNameTextField.getText().equals(userName)) {
simpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "用户名不正确!");
return false;
}
if (!passwordTextField.getText().equals(password)) {
simpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "密码不正确!");
return false;
}
if (!userNameTextField.getText().equals(userName) && !passwordTextField.getText().equals(password)) {
simpleTools.informationDialog(Alert.AlertType.ERROR, "提示", "错误", "用户名和密码均不正确!");
return false;
}
if (userNameTextField.getText().equals(userName) && passwordTextField.getText().equals(password)) {
boolean isOK = simpleTools.informationDialog(Alert.AlertType.INFORMATION, "提示", "信息", "登录成功!");
return isOK;
}
return false;
}
/**
* 操作结果:向下拉列表框中添加列表项
*
* @param comboBox 下拉列表框
* @param items 列表项
*/
public void addComboBoxItems(ComboBox comboBox, Object[] items) {
comboBox.getItems().clear();// 清除下列列表框中的所有选项
ObservableList options = FXCollections.observableArrayList(items);
comboBox.setItems(options);// 添加下拉列表项
}
}
在view包下创建一个logupFrame.fxml的文件,该文件是登录界面的视图文件。
使用Scene Builder设计界面如下:
其代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"
prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="BookManageSystem.controller.LogupFrameController">
<children>
<VBox prefHeight="393.0" prefWidth="600.0">
<children>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
<children>
<Label fx:id="systemLabel" text="图书管理系统">
<font>
<Font name="System Bold" size="40.0"/>
</font>
</Label>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
<children>
<Label fx:id="userNameLabel" text="用户名:"/>
<TextField fx:id="userNameTextField"/>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
<children>
<Label fx:id="passwordLabel" text="密 码:"/>
<PasswordField fx:id="passwordTextField"/>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" spacing="80.0">
<children>
<Button fx:id="logupButton" mnemonicParsing="false" onAction="#logupButtonEvent" text="登录"/>
<Button fx:id="resetButton" mnemonicParsing="false" onAction="#resetButtonEvent" text="重置"/>
</children>
</HBox>
</children>
</VBox>
</children>
</AnchorPane>
接着在controller包创建一个LogupFrameController.java
内容如下:
package BookManageSystem.controller;
import BookManageSystem.tools.SimpleTools;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.stage.Stage;
public class LogupFrameController {
@FXML
private TextField userNameTextField;
@FXML
private PasswordField passwordTextField;
@FXML
private Button logupButton;
@FXML
private Label userNameLabel;
@FXML
private Label systemLabel;
@FXML
private Button resetButton;
@FXML
private Label passwordLabel;
// “登录”按钮的事件监听器方法
public void logupButtonEvent(ActionEvent event) {
}
// “重置”按钮的事件监听器方法
public void resetButtonEvent(ActionEvent event) {
}
}
该代码可以在下图找到:
接着在BookManageSystem目录下创建MainApp.java文件,
其内容如下:
package BookManageSystem;
import BookManageSystem.controller.LogupFrameController;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import java.io.IOException;
public class MainApp extends Application {
private Stage primaryStage;
@Override
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
this.primaryStage.setTitle("图书馆管理系统 ");
initLogupFrame();
}
public static void main(String[] args) {
launch(args);
}
// 登录界面
public void initLogupFrame() {
try {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("view/logupFrame.fxml"));
AnchorPane root = loader.load();
Scene scene = new Scene(root);
primaryStage.setTitle("登录");
primaryStage.setScene(scene);
primaryStage.setResizable(false);
LogupFrameController controller = loader.getController();
controller.setStage(primaryStage);
primaryStage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
该类是初始化启动登录界面的。
在LogupFrameController.java添加如下代码:
private SimpleTools simpleTools = new SimpleTools();
@FXML
private Stage stage;
public Stage getStage() {
return stage;
}
public void setStage(Stage stage) {
this.stage = stage;
}
添加代码的位置如下:
这一切都处理好之后运行项目
为按钮设置图标,在LogupFrameController.java中添加如下方法给按钮设置图标:
public void initialize() {
// 给组件添加图标
Labeled[] labeleds = new Labeled[]{systemLabel, userNameLabel, passwordLabel, logupButton, resetButton};
String[] imagePaths = new String[]{"src/BookManageSystem/images/logo.png", "src/BookManageSystem/images/userName.png",
"src/BookManageSystem/images/password.png",
"src/BookManageSystem/images/login.png", "src/BookManageSystem/images/reset.png"};
simpleTools.setLabeledImage(labeleds, imagePaths);
}
initialize方法是初始化方法,可以使用该方法给界面初始化一些信息,比如说赋初值,设置图标,添加数据等。
再次运行代码:
接着是处理登录按钮的事件,
在logupButtonEvent内些代码处理登录事件,代码如下:
// “登录”按钮的事件监听器方法
public void logupButtonEvent(ActionEvent event) {
stage.close();
boolean isOK = simpleTools.isLogIn(userNameTextField, passwordTextField, "张三", "123456");
if (isOK) {
// 如果登录成功则跳转到主界面
// new MainApp().initMainFrame();
}
}
可以看到if(isOK){}内的代码是注释了的,这是登录成功后跳转到主页面,但是这里还没有该类的代码,所以注释掉不做处理。
运行项目,结果如下:
弹出“登录成功”的提示框,但是点击确定不会跳转到页面,因为代码被注释了。
接着是重置按钮的事件处理代码,如下:
// “重置”按钮的事件监听器方法
public void resetButtonEvent(ActionEvent event) {
userNameTextField.setText("");
passwordTextField.setText("");
}
点击重置按钮即会清空用户输入框的内容。