Java 实现AbstractTableModel到JTable。如何添加方法?

Java 实现AbstractTableModel到JTable。如何添加方法?,java,swing,jdbc,jtable,abstracttablemodel,Java,Swing,Jdbc,Jtable,Abstracttablemodel,我曾经在JTable中显示我的数据库数据,它工作得很好。我发现我需要实现AbstractTableModel或DefaultTableModel来立即更新数据 我不确定我应该在getValueAt()中写什么?我应该在哪里添加fireDataChanged()?感谢您的指导,谢谢 我使用以下代码检索数据库数据: Vector columnNames = new Vector(); Vector data = new Vector(); try { Class.forName("co

我曾经在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 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;
    }
}
公共类CustomTableModel扩展了AbstractTableModel
{
私有静态最终长serialVersionUID=1L;
私有静态最终字符串[]columnNames=新字符串[]{“ID”、“Name”、“Number”、“Yes/No”};
受保护名单;
受保护类[]类型=新类[]{Integer.Class,String.Class,String.Class,Boolean.Class};
公共CustomTableModel(列表lstFoo)
{
this.lstFoo=lstFoo;
fireTableDataChanged();
}
@凌驾
公共字符串getColumnName(int columnIndex)
{
返回columnNames[columnIndex];
}
@凌驾
公共类getColumnClass(int columnIndex)
{
返回类型[列索引];
}
@凌驾
公共布尔值isCellEditable(int行,int列索引)
{
返回false;
}
@凌驾
公共对象getValueAt(int行,int列)
{
if(row<0 | | row>=lstFoo.size())返回null;
Foo obj=lstFoo.get(行);
开关(列)
{
案例0:返回obj.getId();
案例1:返回obj.getName();
案例2:返回obj.getNumber();
案例3:返回obj.isYes();
默认值:返回null;
}
}
@凌驾
public int getRowCount()
{
返回lstFoo.size();
}
@凌驾
public int getColumnCount()
{
返回columnNames.length;
}
}

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

您是否阅读了官方教程?本教程中有什么您不了解的特定内容吗?
public Object getValueAt(){return data;。
你知道你在做什么吗?至少使用
@Override
符号。谢谢你的好意。我不知道我在做什么,这就是我问的原因。我已经看了很多例子,但我仍然不完全明白。请不要,我很抱歉1)添加,2)删除这个答案:-)s/he wants立即向JTable添加数据,如果存在AbstractTableModel,则在JTable的视图中设置xxx add/change/modify value,如果只想编辑一个单元格,为什么要刷新整个JTables结构(例如),而向量基模型更适合SQL,不管它是列表(相同的早熟数组类型),然后(散列)Map可能是一种方式,但Vector更好,与SQL非常相似:-)感谢@mKorbel和垃圾神提供的提示,我不会删除这个答案,只是为了让人们看到您的评论:)另请参阅这个讨论实现
setValueAt()
的相关示例,这是可变
表格模型所必需的。
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;
    }
}