Доброго времени суток, товарищи! Уже несколько дней бьюсь над одной проблемой и не понимаю что я делаю не так.
Есть у меня форма добавления клиента в SQLite базу.
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXTextField?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="230.0" prefWidth="273.0" xmlns="http://javafx.com/javafx/8.0.102" xmlns:fx="http://javafx.com/fxml/1" fx:controller="addClientForm.clientFormController">
<children>
<JFXTextField fx:id="clientIDTextField" layoutX="14.0" layoutY="14.0" prefHeight="25.0" prefWidth="252.0" promptText="ID" />
<JFXTextField fx:id="clientFioTextField" layoutX="14.0" layoutY="48.0" prefHeight="25.0" prefWidth="252.0" promptText="ФИО" />
<JFXTextField fx:id="clientPhoneTextField" layoutX="14.0" layoutY="83.0" prefHeight="25.0" prefWidth="252.0" promptText="Номер телефона" />
<JFXTextField fx:id="clientDiscountTextField" layoutX="14.0" layoutY="122.0" prefHeight="25.0" prefWidth="252.0" promptText="Процент скидки" />
<JFXButton buttonType="RAISED" layoutX="14.0" layoutY="162.0" prefHeight="25.0" prefWidth="252.0" ripplerFill="#18db44" text="Создать" onAction="#addEvent" />
<JFXButton fx:id="exitButton" layoutX="14.0" layoutY="187.0" prefHeight="25.0" prefWidth="252.0" ripplerFill="#18db44" text="Выйти" onAction="#exitEvent" />
</children>
</AnchorPane>
Ну и собственно есть контроллер этой формы.
package addClientForm;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXTextField;
import helpers.SQLiteHelper;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.stage.Stage;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class clientFormController {
@FXML
private JFXButton exitButton;
@FXML
private JFXTextField clientIDTextField;
@FXML
private JFXTextField clientFioTextField;
@FXML
private JFXTextField clientPhoneTextField;
@FXML
private JFXTextField clientDiscountTextField;
@FXML
public void exitEvent()
{
Stage stage = (Stage) exitButton.getScene().getWindow();
stage.close();
}
@FXML
public void addEvent()
{
Connection connection = helpers.SQLiteHelper.Connect();
String sql = "INSERT INTO client(id,fio,phone,discount) VALUES (?,?,?,?)";
try
{
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,Integer.parseInt(clientIDTextField.getText()));
preparedStatement.setString(2,clientFioTextField.getText());
preparedStatement.setString(3,clientPhoneTextField.getText());
preparedStatement.setInt(4,Integer.parseInt(clientDiscountTextField.getText()));
preparedStatement.executeUpdate();
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Информация");
alert.setHeaderText(null);
alert.setContentText("Готово!");
alert.showAndWait();
}
catch (SQLException exp)
{
System.out.println(exp);
}
}
}
Данный код работает и все в нем хорошо.
Однако есть у меня другая форма, которая по своей концепции и реализации практически не отличается от формы что выше. Код формы:
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import com.jfoenix.controls.JFXComboBox?>
<?import com.jfoenix.controls.JFXTextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.collections.*?>
<?import java.lang.String?>
<AnchorPane prefHeight="270.0" prefWidth="270.0" xmlns="http://javafx.com/javafx/8.0.102" xmlns:fx="http://javafx.com/fxml/1" fx:controller="addAnyProductForm.productFormController">
<children>
<JFXComboBox fx:id="productComboBox" layoutX="14.0" layoutY="28.0" prefHeight="25.0" prefWidth="250.0" promptText="Выберите тип продукта">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="Напитки"></String>
<String fx:value="Пицца"></String>
<String fx:value="Салаты"></String>
<String fx:value="Cуши"></String>
</FXCollections>
</items>
</JFXComboBox>
<JFXTextField fx:id="productIdTextField" layoutX="14.0" layoutY="66.0" prefHeight="25.0" prefWidth="250.0" promptText="ID" />
<JFXTextField fx:id="productNameTextField" layoutX="14.0" layoutY="103.0" prefHeight="25.0" prefWidth="250.0" promptText="Название" />
<JFXTextField fx:id="productCountTextField" layoutX="14.0" layoutY="140.0" prefHeight="25.0" prefWidth="250.0" promptText="Кол-во" />
<JFXTextField fx:id="productCostTextField" layoutX="14.0" layoutY="175.0" prefHeight="25.0" prefWidth="250.0" promptText="Цена" />
<JFXButton layoutX="14.0" layoutY="209.0" prefHeight="25.0" prefWidth="250.0" text="Добавить" onAction="#addAction"/>
<JFXButton fx:id="exitButton" layoutX="14.0" layoutY="234.0" prefHeight="25.0" prefWidth="250.0" text="Выход" onAction="#exitAction" />
</children>
</AnchorPane>
И собственно котроллер
package addAnyProductForm;
import com.jfoenix.controls.JFXButton;
import com.jfoenix.controls.JFXCheckBox;
import com.jfoenix.controls.JFXComboBox;
import com.jfoenix.controls.JFXTextField;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.stage.Stage;
import jdk.nashorn.internal.ir.IdentNode;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class productFormController {
@FXML
public JFXButton exitButton;
@FXML public JFXTextField productIdTextField;
@FXML public JFXTextField productNameTextField;
@FXML public JFXTextField productCountTextField;
@FXML public JFXTextField productCostTextField;
@FXML public JFXComboBox productComboBox;
@FXML
public void exitAction()
{
Stage stage = (Stage) exitButton.getScene().getWindow();
stage.close();
}
@FXML
public void addAction()
{
String sql = "";
Connection connection = helpers.SQLiteHelper.Connect();
if (productComboBox.getSelectionModel().getSelectedItem().toString()=="Напитки")
{
sql = "INSERT INTO drinks(id,name,count,cost) VALUES (?,?,?,?)";
}
if (productComboBox.getSelectionModel().getSelectedItem().toString()=="Пицца")
{
sql = "INSERT INTO client_pizza(id,name,count,cost) VALUES (?,?,?,?)";
}
if (productComboBox.getSelectionModel().getSelectedItem().toString()=="Суши")
{
sql = "INSERT INTO sushi(id,name,count,cost) VALUES (?,?,?,?)";
}
if (productComboBox.getSelectionModel().getSelectedItem().toString()=="Салаты")
{
sql = "INSERT INTO salads(id,name,count,cost) VALUES (?,?,?,?)";
}
try
{
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,Integer.parseInt(productIdTextField.getText()));
preparedStatement.setString(2, productNameTextField.getText());
preparedStatement.setInt(3,Integer.parseInt(productCountTextField.getText()));
preparedStatement.setDouble(4,Double.parseDouble(productCostTextField.getText()));
preparedStatement.executeUpdate();
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Информация");
alert.setHeaderText(null);
alert.setContentText("Готово!");
alert.showAndWait();
}
catch (SQLException exp)
{System.out.println(exp);}
}
}
Как вы можете видеть логическая\кодовая разница между двумя контроллерами - минимальна. Однако первая форма полностью рабочая, а вторая форма выдает неприятную ошибку вида:
java.sql.SQLException: The prepared statement has been finalized
Уважаемое сообщество, что я делаю не так? Благодарю вас!
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники