【发布时间】:2023-04-07 02:15:01
【问题描述】:
我有 2 个TableViews (tableProduct, tableProduct2)。第一个由数据库填充,第二个由第一个中的用户项选择填充(addMeal 方法,它也将这些转换为简单的ArrayList)。添加/删除几个对象后,用户可以将当前数据从第二个表保存到 txt 文件。一开始它似乎工作得很好。但是问题开始有点随机显示......我添加了一些项目,保存它,删除一些项目,保存它,一切都很好。然后经过几次这样的操作,即使TableView 为空,最后一个对象仍保留在 txt 文件中。我无法做任何事情来删除它,而且我没有收到任何错误...
有什么想法吗?
public void addMeal() {
productData selection = tableProduct.getSelectionModel().getSelectedItem();
if (selection != null) {
tableProduct2.getItems().add(new productData(selection.getName() + "(" + Float.parseFloat(weightField.getText()) + "g)", String.valueOf(Float.parseFloat(selection.getKcal())*(Float.parseFloat(weightField.getText())/100)), String.valueOf(Float.parseFloat(selection.getProtein())*(Float.parseFloat(weightField.getText())/100)), String.valueOf(Float.parseFloat(selection.getCarb())*(Float.parseFloat(weightField.getText())/100)), String.valueOf(Float.parseFloat(selection.getFat())*(Float.parseFloat(weightField.getText())/100))));
productlist.add(new productSimpleData(selection.getName() + "(" + Float.parseFloat(weightField.getText()) + "g)", String.valueOf(Float.parseFloat(selection.getKcal())*(Float.parseFloat(weightField.getText())/100)), String.valueOf(Float.parseFloat(selection.getProtein())*(Float.parseFloat(weightField.getText())/100)), String.valueOf(Float.parseFloat(selection.getCarb())*(Float.parseFloat(weightField.getText())/100)), String.valueOf(Float.parseFloat(selection.getFat())*(Float.parseFloat(weightField.getText())/100))));
}
updateSummary();
}
public void deleteMeal() {
productData selection = tableProduct2.getSelectionModel().getSelectedItem();
if(selection != null){
tableProduct2.getItems().remove(selection);
Iterator<productSimpleData> iterator = productlist.iterator();
productSimpleData psd = iterator.next();
if(psd.getName().equals(String.valueOf(selection.getName()))) {
iterator.remove();
}
}
updateSummary();
}
public void save() throws IOException {
File file = new File("C:\\Users\\Maciek\\Desktop\\test1.txt");
if(file.exists()){
file.delete();
}
FileWriter fw = null;
BufferedWriter bw = null;
try {
fw = new FileWriter(file);
bw = new BufferedWriter(fw);
Iterator iterator;
iterator = productlist.iterator();
while (iterator.hasNext()) {
productSimpleData pd;
pd = (productSimpleData) iterator.next();
bw.write(pd.toString());
bw.newLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
bw.flush();
bw.close();
}
}
是的,我意识到 addMethod 里面的 if 语句看起来很吓人,但不要介意,毕竟那部分没关系......
【问题讨论】:
-
一个可能的来源是
productData和productSimpleData上的getName()方法。您没有为此提供代码,但从addMeal()中的创建代码看来,您的原始名称与Float.parseFloat(weightField.getText())结果连接以创建新名称。这可能会在每次调用时返回不同的结果,因此您认为应该相等的名称/对象不是。尝试在对象上使用整数标识符,或将名称和权重字段分开。 (类名也应该遵守约定,例如ProductData、ProductSimpleData)
标签: arraylist javafx bufferedwriter