Tableview в JavaFX загружает данные дважды после добавления новых данных в Tableview - PullRequest
0 голосов
/ 09 февраля 2020

Я работаю над приложением для нашего склада. У меня есть данные чтения 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;
}





}

1 Ответ

0 голосов
/ 10 февраля 2020

Полагаю, это потому, что вы инициализируете подборки ObservableList один раз при создании класса. Вы пытались переместить инициализацию (= FXCollections.observableArrayList ();) внутри метода AddPick? Таким образом, при каждом вызове метода будет генерироваться пустой список, поэтому элементы добавляются в вашу БД только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...