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