在 MVC 架构中从 DefaultTableModel 获取数据到 JTable

Getting Data From DefaultTableModel to a JTable In The MVC Architecture

我在将 Table 模型(在模型中)与我的 JTable(在视图中)分开时遇到问题,我的模型包含从中获取数据所需的查询使用 buildTableModel() 方法的数据库:

Model.java

public static DefaultTableModel buildTableModel(ResultSet rs)
            throws SQLException {

        ResultSetMetaData metaData = rs.getMetaData();

        // names of columns
        Vector<String> columnNames = new Vector<String>();
        int columnCount = metaData.getColumnCount();
        for (int column = 1; column <= columnCount; column++) {
            columnNames.add(metaData.getColumnName(column));
        }

        // data of the table
        Vector<Vector<Object>> data = new Vector<Vector<Object>>();
        while (rs.next()) {
            Vector<Object> vector = new Vector<Object>();
            for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                vector.add(rs.getObject(columnIndex));
            }
            data.add(vector);
        }

        return new DefaultTableModel(data, columnNames);

    }

    //queries to execute for Jtable model listProduit
    public ResultSet productList()throws SQLException{
        ResultSet rs = stmt.executeQuery("SELECT * from Lot");

        return rs;
    }

View.java

public class View extends JPanel{


    public  DefaultTableModel dt;

    public  JTable productTable;

    private JScrollPane scrolPane;

    public ListProduit(){


        productTable=new JTable(dt);

        this.setLayout(new GroupLayout(this));
        this.setBackground(Color.decode("#CFDBC5"));

        productTable.setPreferredScrollableViewportSize(new Dimension(500,50));
        productTable.setFillsViewportHeight(true);

        scrolPane= new JScrollPane(productTable);
        this.add(scrolPane);

        this.setVisible(true);


    } 

//setter for the table model
public void setDt(DefaultTableModel dt) {
        this.dt = dt;
        this.dt.fireTableDataChanged();
    }

这是我遇到问题的部分:

Controller.java

            try{   //lines of the problem:
                    ResultSet rs= model.productList();
                    DefaultTableModel dtm = Model.buildTableModel(rs);
                    View.setDt(dtm);
                    // Stuff to handle showing the view
                    showFourthCard();
                    panelList.add(4);
                }catch(SQLException ex){
                    ex.printStackTrace();
                }

显然 JTable 无法更改它第一次获得的 DefaultTbaleModel 对象,所以当我执行时,我总是得到一个空白的 JTable,所以简而言之我无法在 Controller.java.

中设置新的 DefaultTableModel 对象

注意: 当我不使用 MVC 时这很好用(因为我不必设置 Table 模型),所以我的问题主要在于 JTable 与 Table 模型的分离。

Apparentlly the JTable can not change the DefaultTbaleModel object that it gets in the first time so when I'm executing I always get a blank JTable, so in short I cannot set a new DefaultTableModel object in my Controller.java.

public void setDt(DefaultTableModel dt) {
    this.dt = dt;
    this.dt.fireTableDataChanged();
} 

上面的代码只是改变了字段,并没有改变JTable实例的TableModel(例如productTable,它最初是在构造函数中设置的)。调用 JTable 实例本身以实际更改支持 JTable 的模型,例如 productTable.setModel(dt);