combate el sistema java ama de llaves de facturación (8) - Añadir interfaz y funciones para lograr Cuentas

Esta cláusula general

 

En este apartado se añadirá en los registros contables.

 

preparatorio

Añadir registros obtenidos en esta sección se utilizará en la clasificación consulta de la información, por lo que la creación de la clase DAO ClassificationDao.java en el paquete, de la siguiente manera:

package AccountSystem.dao;
​
import AccountSystem.bean.Classification;
​
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
​
public class ClassificationDao {
​
    /**
     * 通过收入或支出类型获取所有的分类信息
     *
     * @param classificationType 收入或支出分类
     * @return 返回得到的分类信息
     */
    public List<Classification> selectByType(String classificationType) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<Classification> classificationList = new ArrayList<Classification>();
        try {
            //获得数据的连接
            conn = JDBCUtils.getConnection();
            //获得Statement对象
            stmt = conn.createStatement();
            // 拼接SQL语句
            String sql = "select * from tb_classification where cType='" + classificationType + "';";
            //发送SQL语句
            rs = stmt.executeQuery(sql);
            while (rs.next()) {
                Classification classification = new Classification();
                classification.setcId(rs.getInt(1));
                classification.setcName(rs.getString(2));
                classification.setcType(rs.getString(3));
                classificationList.add(classification);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(rs, stmt, conn);
        }
        return classificationList;
    }
}

 

implementar la interfaz

Debe primero completar una característica añadida en JavaFX, crear primero archivos de vista FXML, a continuación, crear la clase controlador asociado Controller, entonces el método a archivos de vista FXML carga creados en MainApp, y finalmente llamar en un evento .

En vista addAccountFrame.fxml paquete crean archivos, y el uso de la escena del constructor diseño de la interfaz, propiedades y eventos de cada método de control se refieren a los siguientes códigos:

<?xml version="1.0" encoding="UTF-8"?>
​
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
            fx:controller="AccountSystem.controller.AddAccountFrameController">
    <children>
        <VBox alignment="CENTER" focusTraversable="true" layoutX="137.0" prefHeight="400.0" prefWidth="326.0"
              spacing="20.0">
            <children>
                <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
                    <children>
                        <Label fx:id="descriptionLabel" text="添加"/>
                    </children>
                </HBox>
                <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0">
                    <children>
                        <Label text="类型:"/>
                        <HBox alignment="CENTER_LEFT" prefHeight="30.0" prefWidth="240.0" spacing="50.0">
                            <children>
                                <RadioButton fx:id="outputRadioButton" mnemonicParsing="false"
                                             onAction="#outputRadioButtonEvent" text="支出">
                                    <toggleGroup>
                                        <ToggleGroup fx:id="group"/>
                                    </toggleGroup>
                                </RadioButton>
                                <RadioButton fx:id="inputRadioButton" mnemonicParsing="false"
                                             onAction="#inputRadioButtonEvent" text="收入" toggleGroup="$group"/>
                            </children>
                        </HBox>
                    </children>
                </HBox>
                <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0">
                    <children>
                        <Label text="金额:"/>
                        <TextField fx:id="moneyTextField" prefHeight="30.0" prefWidth="240.0" promptText="请填入金额:"/>
                    </children>
                </HBox>
                <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0">
                    <children>
                        <Label text="分类:"/>
                        <ComboBox fx:id="classificationComboBox" onAction="#classificationComboBoxEvent"
                                  prefHeight="30.0" prefWidth="240.0" promptText="请选择分类:"/>
                    </children>
                </HBox>
                <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0">
                    <children>
                        <Label text="备注:"/>
                        <TextArea fx:id="memoTextArea" prefHeight="200.0" prefWidth="240.0" promptText="请填入备注:"/>
                    </children>
                </HBox>
                <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0">
                    <children>
                        <Label text="日期:"/>
                        <DatePicker fx:id="datePickerTextField" prefHeight="30.0" prefWidth="240.0"
                                    promptText="请选择日期:"/>
                    </children>
                </HBox>
                <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
                    <children>
                        <Button fx:id="addButton" mnemonicParsing="false" onAction="#addButtonEvent" text="添加"/>
                    </children>
                </HBox>
            </children>
            <opaqueInsets>
                <Insets/>
            </opaqueInsets>
            <padding>
                <Insets bottom="20.0"/>
            </padding>
        </VBox>
    </children>
</AnchorPane>

A continuación, crear la clase AddAccountFrameController.java en el paquete de controlador y el copiado de los objetos de la escena Builder y eventos en el método de control de la clase:

package AccountSystem.controller;
​
import AccountSystem.bean.Classification;
import AccountSystem.bean.Record;
import AccountSystem.bean.Session;
import AccountSystem.dao.ClassificationDao;
import AccountSystem.dao.RecordDao;
import AccountSystem.tools.PublicTools;
import AccountSystem.tools.SimpleTools;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.*;
​
import java.util.List;
​
/**
 * 添加账目界面控制器
 *
 * @author lck100
 */
public class AddAccountFrameController {
    private PublicTools publicTools = new PublicTools();
​
    @FXML
    private String selectedRadioButton = null;
​
    @FXML
    private String selectedCoboboxItem = null;
​
    @FXML
    private Label descriptionLabel;
​
    @FXML
    private RadioButton outputRadioButton;
​
    @FXML
    private DatePicker datePickerTextField;
​
    @FXML
    private TextField moneyTextField;
​
    @FXML
    private RadioButton inputRadioButton;
​
    @FXML
    private TextArea memoTextArea;
​
    @FXML
    private ComboBox<?> classificationComboBox;
​
    /**
     * “添加”按钮的事件监听器
     *
     * @param actionEvent 事件
     */
    @FXML
    public void addButtonEvent(ActionEvent actionEvent) {
      
    }
​
    /**
     * “支出”单选按钮的事件监听器
     *
     * @param actionEvent 事件
     */
    public void outputRadioButtonEvent(ActionEvent actionEvent) {
       
    }
​
    /**
     * “收入”单选按钮的事件监听器
     *
     * @param actionEvent 事件
     */
    public void inputRadioButtonEvent(ActionEvent actionEvent) {
      
    }
​
    /**
     * ”分类“下拉列表框的事件监听器
     *
     * @param actionEvent 事件
     */
    public void classificationComboBoxEvent(ActionEvent actionEvent) {
       
    }
}

Código Descripción:

Usted puede ver que hay cuatro método de escucha de eventos anterior, agregar un controlador de eventos de botón Es bien sabido que cuando el registro después de que el usuario introduce información en una tabla de base de datos, pero los otros tres métodos puede no entender por qué quieren escuchar. Los "gastos" y el botón de radio oyentes de "ingreso" son similares, ya que "el gasto" Existen muchas clasificaciones diferentes, y estas clasificaciones se muestran en el cuadro de lista de menú desplegable, también se muestra la misma clasificación de todos "ingreso" en el cuadro de lista desplegable, es imposible clasificar los ingresos y gastos se muestran juntos, los dos botones de configuración anteriores no tendrían sentido, no habrá división de ingresos y gastos.

Por eso, cuando el usuario selecciona el botón de radio "ingreso", todos los nombres de categoría de ingresos que se rellenará el cuadro de lista desplegable;-Cuando el usuario selecciona "pasar" botón de radio, todo va a nombre de la categoría de gasto para llenar el siguiente desplegable cuadro de lista, lo que permite al usuario seleccionar la categoría por separado.

Desplegable cuadro de lista monitorizar dinámicamente eventos es conseguir que el nombre de la categoría seleccionada por el usuario.

Los siguientes cambios demostrarán escuchando botones de radio:

Haga clic en "Añadir" para añadir la interfaz de menú emergente de la siguiente manera (esta vez dos botones de radio no son seleccionados, por lo que no hay ninguna lista de valores de caja desplegable):

Seleccione el botón de opción "gasto", la siguiente clasificación de todos los "gastos" nombre de la categoría:

Seleccione el botón de opción "ingreso", la siguiente clasificación de todos los nombres de categoría "ingreso":

Y una vista de la interfaz del controlador terminado, seguido por la carga de la vista de la interfaz FXML, añadir el siguiente método de MainApp.java archivo addAccountFrame.fxml de carga:

    /**
     * 操作结果:添加账目界面
     */
    public Scene initAddFrame() {
        try {
            Parent page = FXMLLoader.load(getClass().getResource("view/addAccountFrame.fxml"));
​
            Stage mainFrameStage = new Stage();
            mainFrameStage.setTitle("添加账目");
            mainFrameStage.setResizable(true);
            mainFrameStage.setAlwaysOnTop(false);
            mainFrameStage.initModality(Modality.APPLICATION_MODAL);
            mainFrameStage.initOwner(primaryStage);
            Scene scene = new Scene(page);
            mainFrameStage.setScene(scene);
​
            mainFrameStage.show();
            return scene;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

A continuación, añadir un elemento de menú se invoca en el caso MainPageController.java:

    /**
     * ”添加“菜单项的事件监听器
     *
     * @param actionEvent 事件
     */
    @FXML
    public void addMenuItemEvent(ActionEvent actionEvent) {
        // 刷新界面数据
        initialize();
        // 调用添加账目界面
        mainApp.initAddFrame();
    }

Ejecutar el proyecto se puede ver la interfaz añadido, pero no hay un controlador de eventos, única interfaz.

 

Agregar características

AddAccountFrameController funcionalidad add implementado en el método addButtonEvent (), como sigue:

        // 类型
        String type = selectedRadioButton;
        // 金额,把从文本框得到的string类型数据转换为float类型
        float money = Float.parseFloat(moneyTextField.getText());
        // 分类
        String classification = selectedCoboboxItem;
        // 备注
        String memo = memoTextArea.getText();
        // 日期
        String date = datePickerTextField.getValue().toString();
        // 将用户输入的数据封装到Record实体类中
        Record record = new Record(Session.getUser().getUserId(), type, money, classification, memo, date);
        // 实例化RecordDao对象
        RecordDao recordDao = new RecordDao();
        // 添加数据到数据库
        boolean b = recordDao.addRecord(record);
        // 对添加操作的结果进行判断处理
        if (b) {
            SimpleTools.informationDialog(Alert.AlertType.INFORMATION, "提示", "信息", "添加账目成功!");
            // 清空用户选择
            outputRadioButton.setSelected(false);
            inputRadioButton.setSelected(false);
            moneyTextField.setText("");
            classificationComboBox.getItems().clear();
            memoTextArea.setText("");
            datePickerTextField.getEditor().setText("");
        } else {
            SimpleTools.informationDialog(Alert.AlertType.ERROR, "提示", "错误", "添加账目失败!");
        }

Código Descripción: adquirir información introducida por el usuario, y luego encapsulado Registro objeto de clase de entidad, llamada addRecord RecordDao () en la operación de adición, y luego añadir los resultados del proceso de determinación.

Procesamiento de Eventos "gastando" botones de radio son los siguientes:

    /**
     * “支出”单选按钮的事件监听器
     *
     * @param actionEvent 事件
     */
    public void outputRadioButtonEvent(ActionEvent actionEvent) {
        // 获取支出分类的所有信息
        List<Classification> classificationList = new ClassificationDao().selectByType("支出");
        // 实例化一个一维数组
        String[] classificationNames = new String[classificationList.size()];
        // 将查询得到的分类名称装到一维数组中
        for (int i = 0; i < classificationList.size(); i++) {
            classificationNames[i] = classificationList.get(i).getcName();
        }
        // 给下拉列表框添加选项
        publicTools.public_addComboBoxItems(classificationComboBox, classificationNames);
        // 获取单选按钮项
        selectedRadioButton = outputRadioButton.getText();
        // 设置descriptionLabel文本内容
        descriptionLabel.setText("添加" + outputRadioButton.getText());
    }

Definiciones: Por método de la clase selectByType ClassificationDao para obtener todos los nombres de categoría de gastos, y la convierte () en el que una matriz unidimensional, y luego llamar public_addComboBoxItems () de la clase PublicTools llenan de datos, y los suministros del botón de opción seleccionado asignar un valor a una variable y, a continuación, utilizar el manejo de "añadir" del evento.

Procesamiento de Eventos botón de "ingreso" es el siguiente:

    /**
     * “收入”单选按钮的事件监听器
     *
     * @param actionEvent 事件
     */
    public void inputRadioButtonEvent(ActionEvent actionEvent) {
        // 获取收入分类的所有信息
        List<Classification> classificationList = new ClassificationDao().selectByType("收入");
        // 实例化一个一维数组
        String[] classificationNames = new String[classificationList.size()];
        // 将查询得到的分类名称装到一维数组中
        for (int i = 0; i < classificationList.size(); i++) {
            classificationNames[i] = classificationList.get(i).getcName();
        }
        // 给下拉列表框添加选项
        publicTools.public_addComboBoxItems(classificationComboBox, classificationNames);
        // 获取单选按钮项
        selectedRadioButton = inputRadioButton.getText();
        //设置descriptionLabel文本内容
        descriptionLabel.setText("添加" + inputRadioButton.getText());
    }

"Categoría" controlador de eventos lista caja desplegable de la siguiente manera:

    /**
     * ”分类“下拉列表框的事件监听器
     *
     * @param actionEvent 事件
     */
    public void classificationComboBoxEvent(ActionEvent actionEvent) {
        //只处理选中的状态
        selectedCoboboxItem = (String) classificationComboBox.getSelectionModel().selectedItemProperty().getValue();
    }

Toda la lógica de finalización de código, ahora se está ejecutando el proyecto, la función de prueba:

A continuación, puede ver el registro agregado de éxito en la interfaz principal:

 

 

número de micro-canales públicos de búsqueda [ programa de ejemplo de Java ] o escanear el código Fanger Wei para obtener más atención del público.

Nota: Responder a [el fondo público número 20200324 ] se puede obtener el código fuente de este capítulo.

 

Publicados 500 artículos originales · ganado elogios 77 · vistas 160 000 +

Supongo que te gusta

Origin blog.csdn.net/cnds123321/article/details/104278434
Recomendado
Clasificación