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

标签 java swing model-view-controller jtable defaulttablemodel

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

模型.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时,这工作得很好(因为我不必设置表模型),所以我的问题主要是将 JTable 与表模型分离。

最佳答案

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);

关于java - 在 MVC 架构中从 DefaultTableModel 获取数据到 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39272302/

相关文章:

Java Canvas绘制图像闪烁

model-view-controller - MVC - 从另一个模型引用模型

macos - 我的新 Controller 的父类(super class)应该是什么?

java - 我无法让jsp执行SQL更新语句

java - 物理设备测试和 google-app-engine 后端

Java - 冲突的接口(interface)类型参数

java - 使用 JavaFX 创建 webapp - 可能吗?

java - 根据差异将数组过滤为每十的倍数一行?

java - JPanel 和 BufferedImage

java - 处理 JPanel 中生成的形状