java - JavaFX TableView 不更新值
问题描述
我正在做一个个人项目,我的应用程序“管理”汽车经销商的数据。有一些菜单可以让您将汽车添加到车库,还有一些菜单可以让您出售汽车。该应用程序适用于员工,基本上是他们用来存储销售额的系统。数据存储是通过离线方法进行的(这不是问题的根源,它工作得很好)。我相信问题在于从列表中删除汽车的方法。为了向 java 显示 TableView 何时需要更新,我在一个可公开访问的静态变量中插入了一个侦听器,理论上,当该变量变为 true 时,表会更新。
NEEDS_DATA_UPDATE.addListener((observable, oldValue, newValue) -> {
if(newValue){
try {
tableView.getItems().clear();
tableView.setItems(DataStorageService.carsStoraged());
tableView.refresh();
NEEDS_DATA_UPDATE.set(false);
} catch (IOException e) {
e.printStackTrace();
}
}
});
如此 gif 所示:https ://gph.is/g/EGnGANM ,表仅在我再次按下“删除”按钮时才真正更新,即使tableView.getItems().size()
在该行之后返回正确的值tableView.setItems(DataStorageService.carsStoraged());
(在 IDE 的调试功能中检查) . 也就是说,即使表格包含正确的项目,GUI 也不会显示正确的信息。
这是控制器类:
package garage;
import entities.Car;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import main.Main;
import services.DataStorageService;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
public class GarageController implements Initializable {
public static SimpleBooleanProperty NEEDS_DATA_UPDATE = new SimpleBooleanProperty(false);
@FXML
public Button exitButton;
public Button insertButton;
public Button removeButton;
public Button backButton;
public TableView<Car> tableView;
public TableColumn<Car, String> brand;
public TableColumn<Car, String> model;
public TableColumn<Car, Double> value;
public TableColumn<Car, Integer> mileage;
@FXML
public void onActionExitButton(ActionEvent actionEvent){
Stage stage = (Stage) exitButton.getScene().getWindow();
stage.close();
}
public void onActionInsertButton(ActionEvent actionEvent) throws IOException {
Stage popup = new Stage();
popup.setScene(new Scene(FXMLLoader.load(Main.class.getResource("../garage/newCar_scene.fxml"))));
popup.initStyle(StageStyle.UNDECORATED);
popup.setX(380);
popup.setY(260);
popup.show();
}
public void onActionRemoveButton(ActionEvent actionEvent) throws IOException {
try {
DataStorageService.removeCarFromFile(tableView.getSelectionModel().getSelectedItem());
tableView.getSelectionModel().clearSelection();
}
catch (NullPointerException e){
Main.showInvalidEntryPopUp();
}
finally{
NEEDS_DATA_UPDATE.set(true);
}
}
public void onActionBackButton(ActionEvent actionEvent) throws IOException {
Main.enterMain((Stage) exitButton.getScene().getWindow());
}
public void updateTable() throws IOException{
tableView.setItems(DataStorageService.carsStoraged());
tableView.refresh();
}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
brand.setCellValueFactory(new PropertyValueFactory<>("Brand"));
model.setCellValueFactory(new PropertyValueFactory<>("Model"));
value.setCellValueFactory(new PropertyValueFactory<>("Value"));
mileage.setCellValueFactory(new PropertyValueFactory<>("Mileage"));
NEEDS_DATA_UPDATE.addListener((observable, oldValue, newValue) -> {
if(newValue){
try {
updateTable();
NEEDS_DATA_UPDATE.set(false);
} catch (IOException e) {
e.printStackTrace();
}
}
});
NEEDS_DATA_UPDATE.set(true);
}
}
如果找不到错误(我承认,stackoverflow 是我最后的选择,我已经做了我的知识允许的所有事情),我该如何重写这个功能?
解决方案
推荐阅读
- c# - 在包含所述接口类型成员的类上定义接口类型的正确方法
- graphql-java - 读取通过 GraphQL Java 中的变量传递的字段的参数
- javascript - 在 JavaScript 中,将类名分配给常规元素和命名空间元素是否不同?
- javascript - eval 可以用来声明多个全局类吗?
- python - 沿每个轴应用 DCT 矩阵未给出所需结果
- html - 如何在不扩展标题的情况下扩展元素(img)
- sql - 通过迭代另一个表将值插入到表中
- tensorflow - 从嵌套网络获取中间层输出 - Keras
- python - 将 midi 时间转换为小节和节拍
- html - 带有百分比减法的输入框内的文本缩进