首页 > 解决方案 > 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 是我最后的选择,我已经做了我的知识允许的所有事情),我该如何重写这个功能?

标签: javajavafxtableview

解决方案


推荐阅读