2016-09-01 90 views
0

我在從JTable(在視圖中)中分離表模型(模型中)時出現問題,我的模型包含從數據庫與buildTableModel()方法:在MVC體系結構中將數據從DefaultTableModel獲取到JTable

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

Apparentlly當我JTable不能改變DefaultTbaleModel對象,它會在第一時間使正在執行我總是得到一個空白的JTable,所以總之我不能在我的Controller.java中設置一個新的DefaultTableModel對象。

注:這個時候我不使用MVC(因爲我沒有設置表型號)工作得很好,所以我在這裏的問題主要是JTable中從表型號分離。

回答

2

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