Я работаю над приложением для нашего склада. У меня есть данные чтения Tableview из базы данных SQL. Есть кнопка Добавить, которая позволяет вводить новые продукты в Табличное представление. Tableview загружается просто отлично, когда запускается, но когда я добавляю новый продукт, продукт добавляет просто отлично, только Tableview загружает все снова. Это дает двойные записи в табличном представлении. Глядя на таблицу базы данных в DBeaver, все правильно (там нет двойных записей и добавлен новый продукт).
В моей предыдущей версии (перед использованием JavaFx) я бы добавил метод к функциональности Add, который позволяет Tableview самостоятельно обновлять sh. Это работало нормально. Сейчас я работаю с JavaFX, и этот же принцип создает мне эту проблему.
Вот метод загрузки:
private void LoadPickTableMethod() {
String sql3 = "SELECT * FROM PICKLOCATIES";
try {
Connection con = ConnectDatabase.conDB();
ResultSet rs = con.createStatement().executeQuery(sql3);
while (rs.next()) {
picklocaties.add(new TableModel(rs.getString("ID"),
rs.getString("LOCATIE"),
rs.getString("ARTIKELCODE"),
rs.getString("OMSCHRIJVING"),
rs.getString("EENHEID"),
rs.getString("HAL"),
rs.getString("CODE"),
rs.getString("AANTAL"),
rs.getString("INITIAAL"),
rs.getString("MAX")));
}
} catch (SQLException ex) {
Logger.getLogger(ZoekenFXMLController.class.getName()).log(Level.SEVERE, null, ex);
}
col_id2.setCellValueFactory(new PropertyValueFactory<>("Id"));
col_locatie2.setCellValueFactory(new PropertyValueFactory<>("Locatie"));
col_artikelcode2.setCellValueFactory(new PropertyValueFactory<>("Artikelcode"));
col_omschrijving2.setCellValueFactory(new PropertyValueFactory<>("Omschrijving"));
col_eenheid2.setCellValueFactory(new PropertyValueFactory<>("Eenheid"));
col_hal1.setCellValueFactory(new PropertyValueFactory<>("Hal"));
col_oescode.setCellValueFactory(new PropertyValueFactory<>("Code"));
col_initiaalP.setCellValueFactory(new PropertyValueFactory<>("Initiaal"));
col_aantalP.setCellValueFactory(new PropertyValueFactory<>("Aantal"));
col_max.setCellValueFactory(new PropertyValueFactory<>("Max"));
searchTable1.setItems(picklocaties);
col_id.setCellValueFactory(new PropertyValueFactory<>("Id"));
col_locatie.setCellValueFactory(new PropertyValueFactory<>("Locatie"));
col_artikelcode.setCellValueFactory(new PropertyValueFactory<>("Artikelcode"));
col_omschrijving.setCellValueFactory(new PropertyValueFactory<>("Omschrijving"));
col_eenheid.setCellValueFactory(new PropertyValueFactory<>("Eenheid"));
col_hal.setCellValueFactory(new PropertyValueFactory<>("Hal"));
col_oescode1.setCellValueFactory(new PropertyValueFactory<>("Code"));
col_initiaalP1.setCellValueFactory(new PropertyValueFactory<>("Initiaal"));
col_aantalP1.setCellValueFactory(new PropertyValueFactory<>("Aantal"));
col_max1.setCellValueFactory(new PropertyValueFactory<>("Max"));
searchTable.setItems(picklocaties);
}
Этот метод вызывается в начале (инициализация), но также и после нажатия кнопки Добавить. Метод Add:
@FXML
private void AddPick(ActionEvent event) {
try {
String sql = "INSERT INTO PICKLOCATIES"
+ "(artikelcode, locatie, omschrijving, eenheid,code,hal,aantal, initiaal, max)"
+ "VALUES (?,?,?,?,?,?,?,?,?)";
conn = ConnectDatabase.conDB();
pst = conn.prepareStatement(sql);
pst.setString(1, autocompleteTf.getText());
pst.setString(3, pickDescTxt.getText());
pst.setString(2, autocompleteLoc.getText());
pst.setString(4, pickEenheidTxt.getText());
pst.setString(5, oesTxt.getText());
pst.setString(6, autocompleteHal.getText());
pst.setString(7, pickAantalTxt.getText());
pst.setString(8, pickInitiaalTxt.getText());
pst.setString(9, maxAantalTxt.getText());
pst.executeUpdate();
Alert dialog = new Alert(Alert.AlertType.INFORMATION);
dialog.setContentText("Artikel Toegevoegd");
dialog.setHeaderText("Informatie");
dialog.showAndWait();
ClearAllFields();
LoadPickTableMethod();
} catch (Exception e) {
Logger.getLogger(LoginFXMLController.class.getName()).log(Level.SEVERE, null, e);
}
}
Снимок экрана происходящего:
Снимок экрана Tableview
Последняя строка - это недавно добавленный продукт (который загружает только один раз) но приведенные выше строки являются дубликатами. Первые 4 строки являются оригинальными, а 4 ниже являются дубликатами.
Цель состоит в том, чтобы само Tableview обновлялось вновь добавленным продуктом, а не дублировалось вместе с ним.
Любая помощь по этому вопросу будет принята с благодарностью.
Редактировать: согласно запросу, минимальный воспроизводимый пример:
public class HomeFXMLController implements Initializable {
Connection conn = null;
ResultSet rs = null;
PreparedStatement pst = null;
@FXML
private TableView<TableModel> searchTable1;
@FXML
private TableColumn<TableModel, String> col_id2;
@FXML
private TableColumn<TableModel, String> col_locatie2;
@FXML
private TableColumn<TableModel, String> col_artikelcode2;
@FXML
private TableColumn<TableModel, String> col_omschrijving2;
@FXML
private TableColumn<TableModel, String> col_eenheid2;
@FXML
private TableColumn<TableModel, String> col_hal1;
@FXML
private TableColumn<TableModel, String> col_oescode;
@FXML
private TableColumn<TableModel, String> col_aantalP;
@FXML
private TableColumn<TableModel, String> col_initiaalP;
@FXML
private TableColumn<TableModel, String> col_max;
@FXML
private JFXTextField pickEenheidTxt;
@FXML
private JFXTextArea pickDescTxt;
@FXML
private JFXTextField pickIdTxt;
@FXML
private JFXTextField oesTxt;
@FXML
private JFXButton pickAddBtn;
@FXML
private JFXTextField maxAantalTxt;
@FXML
private JFXTextField autocompleteTf;
@FXML
private JFXTextField autocompleteLoc;
@FXML
private JFXTextField autocompleteHal;
ObservableList<TableModel> picklocaties = FXCollections.observableArrayList();
FilteredList filtered = new FilteredList(picklocaties, e -> true);
@Override
public void initialize(URL url, ResourceBundle rb) {
LoadPickTableMethod();
@FXML //this bit is linked to pickAddBtn
private void AddPick(ActionEvent event) {
try {
String sql = "INSERT INTO PICKLOCATIES"
+ "(artikelcode, locatie, omschrijving, eenheid,code,hal,aantal, initiaal, max)"
+ "VALUES (?,?,?,?,?,?,?,?,?)";
conn = ConnectDatabase.conDB();
pst = conn.prepareStatement(sql);
pst.setString(1, autocompleteTf.getText());
pst.setString(3, pickDescTxt.getText());
pst.setString(2, autocompleteLoc.getText());
pst.setString(4, pickEenheidTxt.getText());
pst.setString(5, oesTxt.getText());
pst.setString(6, autocompleteHal.getText());
pst.setString(7, pickAantalTxt.getText());
pst.setString(8, pickInitiaalTxt.getText());
pst.setString(9, maxAantalTxt.getText());
pst.executeUpdate();
Alert dialog = new Alert(Alert.AlertType.INFORMATION);
dialog.setContentText("Artikel Toegevoegd");
dialog.setHeaderText("Informatie");
dialog.showAndWait();
ClearAllFields();
LoadPickTableMethod();
} catch (Exception e) {
Logger.getLogger(LoginFXMLController.class.getName()).log(Level.SEVERE, null, e);
}
}
private void LoadPickTableMethod() {
String sql3 = "SELECT * FROM PICKLOCATIES";
try {
Connection con = ConnectDatabase.conDB();
ResultSet rs = con.createStatement().executeQuery(sql3);
while (rs.next()) {
picklocaties.add(new TableModel(rs.getString("ID"),
rs.getString("LOCATIE"),
rs.getString("ARTIKELCODE"),
rs.getString("OMSCHRIJVING"),
rs.getString("EENHEID"),
rs.getString("HAL"),
rs.getString("CODE"),
rs.getString("AANTAL"),
rs.getString("INITIAAL"),
rs.getString("MAX")));
}
} catch (SQLException ex) {
Logger.getLogger(ZoekenFXMLController.class.getName()).log(Level.SEVERE, null, ex);
}
col_id2.setCellValueFactory(new PropertyValueFactory<>("Id"));
col_locatie2.setCellValueFactory(new PropertyValueFactory<>("Locatie"));
col_artikelcode2.setCellValueFactory(new PropertyValueFactory<>("Artikelcode"));
col_omschrijving2.setCellValueFactory(new PropertyValueFactory<>("Omschrijving"));
col_eenheid2.setCellValueFactory(new PropertyValueFactory<>("Eenheid"));
col_hal1.setCellValueFactory(new PropertyValueFactory<>("Hal"));
col_oescode.setCellValueFactory(new PropertyValueFactory<>("Code"));
col_initiaalP.setCellValueFactory(new PropertyValueFactory<>("Initiaal"));
col_aantalP.setCellValueFactory(new PropertyValueFactory<>("Aantal"));
col_max.setCellValueFactory(new PropertyValueFactory<>("Max"));
searchTable1.setItems(picklocaties);
col_id.setCellValueFactory(new PropertyValueFactory<>("Id"));
col_locatie.setCellValueFactory(new PropertyValueFactory<>("Locatie"));
col_artikelcode.setCellValueFactory(new PropertyValueFactory<>("Artikelcode"));
col_omschrijving.setCellValueFactory(new PropertyValueFactory<>("Omschrijving"));
col_eenheid.setCellValueFactory(new PropertyValueFactory<>("Eenheid"));
col_hal.setCellValueFactory(new PropertyValueFactory<>("Hal"));
col_oescode1.setCellValueFactory(new PropertyValueFactory<>("Code"));
col_initiaalP1.setCellValueFactory(new PropertyValueFactory<>("Initiaal"));
col_aantalP1.setCellValueFactory(new PropertyValueFactory<>("Aantal"));
col_max1.setCellValueFactory(new PropertyValueFactory<>("Max"));
searchTable.setItems(picklocaties);
}
private void ClearAllFields() {
autocompleteTf.setText("");
pickDescTxt.setText("");
pickEenheidTxt.setText("");
autocompleteHal.setText("");
autocompleteLoc.setText("");
oesTxt.setText("");
pickAantalTxt.setText("");
pickInitiaalTxt.setText("");
maxAantalTxt.setText("");
}
}
Модель таблицы:
package voorraadsysteem;
public class TableModel {
public final String ID, Locatie, Artikelcode, Omschrijving,
Eenheid,
Hal, Code, Aantal, Initiaal, Max;
public TableModel(
String ID,
String Locatie,
String Artikelcode,
String Omschrijving,
String Eenheid,
String Hal,
String Code,
String Aantal,
String Initiaal,
String Max)
{
this.ID = ID;
this.Locatie = Locatie;
this.Artikelcode = Artikelcode;
this.Omschrijving = Omschrijving;
this.Eenheid = Eenheid;
this.Hal = Hal;
this.Code = Code;
this.Aantal = Aantal;
this.Initiaal = Initiaal;
this.Max = Max;
}
public String getID() {
return ID;
}
public String getLocatie() {
return Locatie;
}
public String getArtikelcode() {
return Artikelcode;
}
public String getOmschrijving() {
return Omschrijving;
}
public String getEenheid() {
return Eenheid;
}
public String getHal() {
return Hal;
}
public String getOescode() {
return Code;
}
public String getAantal() {
return Aantal;
}
public String getInitiaal() {
return Initiaal;
}
public String getMax(){
return Max;
}
}