2012-05-11 24 views
0

我曾经在JTable中显示我的数据库数据,它工作正常。我发现我需要实现AbstractTableModel或DefaultTableModel来即时更新数据。将AbstractTableModel实现为JTable。如何添加方法?

我不知道我应该在getValueAt()中写什么?我应该在哪里添加fireDataChanged()?任何指导表示赞赏,谢谢!

我用这个代码找回我的数据库中的数据:

Vector columnNames = new Vector(); 
Vector data = new Vector(); 

try 
{ 
    Class.forName("com.mysql.jdbc.Driver"); 
    Connection con = DriverManager.getConnection ("jdbc:mysql://localhost:3306/watchlist","root","root");     

    String sql = "SELECT * FROM watchlist"; 
    Statement stmt = con.createStatement(); 
    ResultSet rs = stmt.executeQuery(sql); 
    ResultSetMetaData md = rs.getMetaData(); 

    int columns = md.getColumnCount(); 
    for (int i = 1; i <= columns; i++) 
    { 
     columnNames.addElement(md.getColumnName(i)); 
    }        

    int rowCount = md.getColumnCount();    
    while (rs.next()) 
    { 
     Vector row = new Vector(rowCount); 

     for (int i=1; i <= rowCount; i++) 
     { 
      row.addElement(rs.getObject(i)); 
     } 

     data.addElement(row); 
    } 

    rs.close(); 
    stmt.close(); 
    con.close();          
} 

catch(Exception e) 
{ 
    System.out.println(e); 
} 

我AbstractTableModel上:

public class MyTableModel extends AbstractTableModel 
{ 
    Vector columnNames = new Vector(); 
    Vector data = new Vector(); 

    public void connectionDB() 
    { 
     try 
     {        
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/watchlist","root","root"); 

      String sql = "SELECT * FROM watchlist"; 
      Statement stmt = con.createStatement(); 
      ResultSet rs = stmt.executeQuery(sql); 
      ResultSetMetaData md = rs.getMetaData(); 
     } 

     catch(Exception e) 
     { 
      System.out.println(e); 
     } 
    } 

    public int getColumnCount() 
    { 
     return columnNames.size(); 
    } 

    public int getRowCount() 
    { 
     return data.size(); 
    } 

    public Object getValueAt() 
    { 
     return data;  
    } 

    public boolean isCellEditable(int row, int col) 
    { 
     return false; 
    } 

} 
+3

你经历过官方教程吗?教程中是否有任何您不明白的具体内容? –

+3

'public Object getValueAt() { return data; ..' 你有什么想法你在做什么?至少使用'@ Override'符号。 –

+0

感谢您的评论。我不知道我在做什么,这就是为什么我问。一直在寻找大量的例子,但我仍然不完全明白。 –

回答

1

下面是使用AbstractTableModel样本:

public class CustomTableModel extends AbstractTableModel 
{ 
    private static final long serialVersionUID = 1L; 
    private static final String[] columnNames = new String[]{"ID", "Name", "Number", "Yes/No"}; 
    protected List<Foo> lstFoo; 
    protected Class<?>[] types = new Class[]{Integer.class, String.class, String.class, Boolean.class}; 

    public CustomTableModel(List<Foo> lstFoo) 
    { 
     this.lstFoo = lstFoo; 
     fireTableDataChanged(); 
    } 

    @Override 
    public String getColumnName(int columnIndex) 
    { 
     return columnNames[columnIndex]; 
    } 

    @Override 
    public Class<?> getColumnClass(int columnIndex) 
    { 
     return types[columnIndex]; 
    } 

    @Override 
    public boolean isCellEditable(int row, int columnIndex) 
    { 
     return false; 
    } 

    @Override 
    public Object getValueAt(int row, int column) 
    { 
     if(row < 0 || row >= lstFoo.size()) return null; 
     Foo obj = lstFoo.get(row); 
     switch(column) 
     { 
      case 0: return obj.getId(); 
      case 1: return obj.getName(); 
      case 2: return obj.getNumber(); 
      case 3: return obj.isYes(); 
      default: return null; 
     } 
    } 

    @Override 
    public int getRowCount() 
    { 
     return lstFoo.size(); 
    } 

    @Override 
    public int getColumnCount() 
    { 
     return columnNames.length; 
    } 
} 
+0

请不要,我很抱歉1)添加[setXxx与fireXxxXxx](http://stackoverflow.com/a/6901508/714968),2)删除这个答案:-) – mKorbel

+0

@mKorbel我贴的代码有什么问题? –

+0

s/he想要立即将数据添加到JTable,如果存在AbstractTableModel,那么setXxx在JTable的视图中添加/更改/修改值,为什么要刷新整个JTables结构(例如)如果只想编辑一个Cell ,并且Vector基础模型对于SQL来说更好,不管是List(相同的过早数组类型),然后(哈希)映射可能会变得方便,但Vector又比较好,非常类似于SQL :-) – mKorbel

0

只差一分,两个到数据库的许多连接将会降低速度和开销。我有这个问题,并能够解决它。

相关问题