簡體   English   中英

從DefaultTableModel到MVC架構中的JTable獲取數據

[英]Getting Data From DefaultTableModel to a JTable In The MVC Architecture

我在從JTable(在視圖中)中分離Table Model(模型中的)時遇到問題,我的模型包含使用buildTableModel()方法從數據庫中獲取數據所需的查詢:

模型

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與表模型的分離。

顯然,JTable無法更改它第一次獲得的DefaultTbaleModel對象,因此在執行時,我總是得到一個空白的JTable,因此總之,我無法在Controller.java中設置新的DefaultTableModel對象。

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

上面的代碼僅更改字段,而不更改JTable實例的TableModel(例如, productTable ,它最初在構造函數中設置)。 調用JTable實例本身以實際更改支持JTable的模型,例如productTable.setModel(dt);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM