JavaFX中的Tableview在Tableview中添加新数据后加载了两次数据

JavaFX中的Tableview在Tableview中添加新数据后加载了两次数据,javafx,netbeans,tableview,Javafx,Netbeans,Tableview,我正在为我们的仓库做申请。我有一个从SQL数据库读取数据的Tableview。有一个添加按钮,允许在Tableview中输入新产品。 Tableview在启动时加载得很好,但是当我添加新产品时,产品添加得很好,只有Tableview再次加载所有内容。这在Tableview中提供了两个条目。查看DBeaver中的数据库表,一切都是正确的(没有双重条目,并且添加了新产品) 在我以前的版本中(在使用JavaFx之前),我将向add功能添加一个方法,该方法允许Tableview自我刷新。这很有效。现在我

我正在为我们的仓库做申请。我有一个从SQL数据库读取数据的Tableview。有一个添加按钮,允许在Tableview中输入新产品。 Tableview在启动时加载得很好,但是当我添加新产品时,产品添加得很好,只有Tableview再次加载所有内容。这在Tableview中提供了两个条目。查看DBeaver中的数据库表,一切都是正确的(没有双重条目,并且添加了新产品)

在我以前的版本中(在使用JavaFx之前),我将向add功能添加一个方法,该方法允许Tableview自我刷新。这很有效。现在我正在使用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);


}
发生的情况的屏幕截图:

最后一行是新添加的产品(仅加载一次),但上面的行是重复的。前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("");
    }

    }

我猜这是因为在创建类时初始化了ObservableList picklocaties一次。您是否尝试将初始化(=FXCollections.observableArrayList();)移动到AddPick方法中?这样,每次调用该方法时都会生成一个空列表,因此只需在数据库中添加一次项。

请。。请学习java命名约定并遵守它们。我在原始帖子中添加了一个示例。因为我在工作时连接到了一个私有服务器,所以我不会发布数据库连接。这些项目在数据库中添加一次。问题是,添加项后,TableView将加载所有内容两次。在Dbeaver中查看我的数据库表不会显示任何双条目。我试过你的建议,但似乎毫无用处。您建议将初始化添加到try-catch块内部还是之后?
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;
}





}