【问题标题】:Implementing AbstractTableModel to JTable. How to add the methods?将 AbstractTableModel 实现到 JTable。如何添加方法?
【发布时间】:2012-05-11 21:42:12
【问题描述】:

我曾经在 JTable 中显示我的数据库数据,它工作正常。我发现我需要实现 AbstractTableModel 或 DefaultTableModel 来立即更新数据。

我不确定我应该在 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; 
    }

}

【问题讨论】:

  • 你看完官方教程了吗?教程中有什么具体的地方你不明白吗?
  • public Object getValueAt() { return data; .. 你知道你在做什么吗?至少使用@Override 表示法。
  • 感谢您的好意。我不知道我在做什么,这就是我问的原因。一直在看大量的例子,但我仍然不完全理解。

标签: java swing jdbc jtable abstracttablemodel


【解决方案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;
    }
}

【讨论】:

  • 请不要,对不起 1) 添加setXxx with fireXxxXxx, 2) 删除这个答案:-)
  • 他/她想立即将数据添加到 JTable,如果有 AbstractTableModel 然后 setXxx 在 JTable 的视图中添加/更改/修改值,为什么要刷新整个 JTables 结构(例如)如果您只想编辑一个单元格,并且 Vector bases 模型更适合 SQL,无论是 List (相同的过早数组类型),然后 (Hash)Map 可能是方式,但 Vector> 更好并且非常相似SQL :-)
  • 感谢@mKorbel 和trashgod 的提示,我不会删除这个答案,只是为了让人们看到你的cmets :)
  • 另见此相关示例,讨论实现setValueAt(),这是可变TableModel 所必需的。
【解决方案2】:

仅仅一点,两个多连接到一个数据库会降低速度和过多的开销。我遇到了这个问题并且能够解决它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 2017-09-19
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    相关资源
    最近更新 更多