Java实战之图书管理系统(JavaFX版)(4)——登录界面及功能实现

首先创建一个普通的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;
    }

添加代码的位置如下:

img

这一切都处理好之后运行项目

为按钮设置图标,在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方法是初始化方法,可以使用该方法给界面初始化一些信息,比如说赋初值,设置图标,添加数据等。

再次运行代码:

img

接着是处理登录按钮的事件,

在logupButtonEvent内些代码处理登录事件,代码如下:

    // “登录”按钮的事件监听器方法
    public void logupButtonEvent(ActionEvent event) {
        stage.close();
        boolean isOK = simpleTools.isLogIn(userNameTextField, passwordTextField, "张三", "123456");
        if (isOK) {
            // 如果登录成功则跳转到主界面
            // new MainApp().initMainFrame();
        }
    }

可以看到if(isOK){}内的代码是注释了的,这是登录成功后跳转到主页面,但是这里还没有该类的代码,所以注释掉不做处理。

运行项目,结果如下:

img

弹出“登录成功”的提示框,但是点击确定不会跳转到页面,因为代码被注释了。

接着是重置按钮的事件处理代码,如下:

    // “重置”按钮的事件监听器方法
    public void resetButtonEvent(ActionEvent event) {
        userNameTextField.setText("");
        passwordTextField.setText("");
    }

点击重置按钮即会清空用户输入框的内容。

 

 

可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。

注意:在公众号后台回复【20200220】获取本节源码。

  • 15
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值