Java 如何将项目列表到JTable

Java 如何将项目列表到JTable,java,sql,jtable,Java,Sql,Jtable,我正在尝试为我的课程创建一个结帐模拟。因此,每次我搜索一个项目时,我都可以从数据库中检索它并将其显示在JTable上。但是,一旦我将一个项目添加到列表中并尝试添加另一个项目,旧项目就会被新项目替换 我试图列出JTable中的所有项,这是我的代码: DBConnection db = new DBConnection(); try { ResultSet rs = DBConnection.stmt.executeQuery("SELECT ID, MESSAGE F

我正在尝试为我的课程创建一个结帐模拟。因此,每次我搜索一个项目时,我都可以从数据库中检索它并将其显示在JTable上。但是,一旦我将一个项目添加到列表中并尝试添加另一个项目,旧项目就会被新项目替换

我试图列出JTable中的所有项,这是我的代码:

DBConnection db = new  DBConnection();
    try {

        ResultSet rs =  DBConnection.stmt.executeQuery("SELECT ID, MESSAGE FROM STOCK WHERE ID = '"+ id + "'"); 

        jTable1.setModel(DbUtils.resultSetToTableModel(rs));




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

    }`

每次得到结果时,只需在JTable模型中添加一行即可

这样说吧

还是你的情况

DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
            model.addRow(new Object[]{searchResultData});

您可以创建一个自定义数据模型,允许您向表中插入新行

假设您有一个类,它可以保存查询结果字段

public class Item implements Comparable<Item> {

    private Long id;
    private String message;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String value) {
        this.message= value;
    }

    @Override
    public int compareTo(Item o) {
        return id.compareTo(o.id);
    }

}
这是表的数据模型

public class Model extends AbstractTableModel {

    private List<Item> items;

    public Model() {
        items = new ArrayList<>();
    }

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

    @Override
    public int getColumnCount() {
        return 3;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        if (rowIndex > items.size() - 1 || rowIndex < 0) {
            return "";
        }
        final Item get = items.get(rowIndex);
        switch (columnIndex) {
            case 0:
                return get.getId();
            case 1:
                return get.getMessage();
        }
        return "";
    }

    @Override
    public String getColumnName(int column) {
        switch (column) {
            case 0:
                return "id";
            case 1:
                return "message";
        }
        return "";
    }

    public void addItem(Item i) {
        items.add(i);
        fireTableDataChanged();
    }

    public void addItem(ResultSet rs) {
        try {
            Item item = new Item();
            item.setId(rs.getLong("ID"));
            item.setMessage(rs.getString("MESSAGE"));
            items.add(item);
            fireTableDataChanged();
        } catch (SQLException ex) {
            Logger.getLogger(Model.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}
并将其设置为表格模型

table.setModel(myModel);
现在,每次您需要向表中添加一些内容时,只需使用我们的表模型即可。我创建了两个方法来插入数据public void addItem i和public void addItemResultSet rs

这应该行得通。若有时需要清除表,只需将pubic方法public void clear添加到您的模型中,您将在其中清除项列表并调用fireTableDataChanged;。这是必需的,否则GUI将不会刷新

编辑

您的代码应该是

    DBConnection db = new DBConnection();
    try {

        ResultSet rs = DBConnection.stmt.executeQuery("SELECT ID, MESSAGE FROM STOCK WHERE ID = '" + id + "'");

        myModel.add(rs);

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

    }
主要问题是DbUtils.ResultSetToTableModelers,它正在创建一个全新的TableModel,其中填充了ResultSet的内容,当应用于JTable时,它正在用TableModel的内容替换视图

为了能够更新表,您需要更新现有的TableModel

有几种方法可以实现这一点,最简单的方法可能是使用DefaultTableModel

首先创建DefaultTableModel的类实例字段

然后,当您想要加载库存项目时,您需要初始化模型(如果尚未初始化),然后将新结果添加到模型中

DBConnection db = new DBConnection();
try (ResultSet rs = DBConnection.stmt.executeQuery("SELECT ID, MESSAGE FROM STOCK WHERE ID = '" + id + "'")) {

    if (stockTableModel == null) {
        stockTableModel = new DefaultTableModel();
        for (int col = 0; col < metaData.getColumnCount(); col++) {
            stockTableModel.addColumn(metaData.getColumnName(col + 1));
        }
        jTable.setModel(model);
    }

    while (rs.next()) {
        Vector rowData = new Vector(metaData.getColumnCount());
        for (int col = 0; col < metaData.getColumnCount(); col++) {
            rowData.add(rs.getObject(col + 1));
        }
        stockTableModel.addRow(rowData);
    }

} catch (SQLException exp) {
    exp.printStackTrace();
}

查看和了解更多详细信息

什么列表?什么桌子?考虑提供一个说明你的问题的方法。这将减少混乱和更好的响应。不要使用DbUtils,它对您没有任何好处。相反,构建一个TableModel,它保持不变,并将新行添加到ResultSet中。请参阅和了解更多详细信息。具体来说,我尝试从数据库中获取数据并将其添加到JTable列表中,但现在每次我从文本字段中搜索项目时,它都会添加到JTable中。但是,当我尝试向JTable列表中添加另一项时,它会替换旧项并显示新项。但是我希望这两个项目都列在JTable中。如何在一个JTable中显示多个数据,而不是只显示一个数据。如果您查看我的代码,您可以看到我在SQL语句中使用WHERE子句。因此,每次我尝试添加一个产品时,它都会添加,但当我尝试添加另一个产品时,它会被替换。我已经尝试过了,并一直将此结果输入到表org.apache.derby.client.net的一个字段中。NetResultSet42@7b06a956don不要直接将结果集放在表中……根据您的表,尝试rs.getStringid或其他方法规格。非常感谢你们的帮助,伙计们,我已经设法解决了问题。你们必须创建一个自定义数据模型-不,你们不需要,你们可以使用DefaultTableModel-而且你们的最后一个示例片段与你们的TableModel不符contract@MadProgrammer好吧,这只是个例子,我没有费心去工作,完全假设,这一意图是明确的。DefaultTableModel也是一种解决方案,但在我看来,自定义模型要好得多。DeffTababMuldOL我认为是一个快速原型解决方案。但我会做出调整,所以答案会更合适。别误会,我通常更喜欢从AbstractTableModel开始…只是说这不是一个必须的情况,而且考虑到老年退休金计划明显缺乏知识,可能有点过头了…但是当你溺水时,还有什么更好的时间来学习挥杆呢;
table.setModel(myModel);
    DBConnection db = new DBConnection();
    try {

        ResultSet rs = DBConnection.stmt.executeQuery("SELECT ID, MESSAGE FROM STOCK WHERE ID = '" + id + "'");

        myModel.add(rs);

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

    }
public class ... {
    //...
    private DefaultTableModel stockTableModel;
    //...
DBConnection db = new DBConnection();
try (ResultSet rs = DBConnection.stmt.executeQuery("SELECT ID, MESSAGE FROM STOCK WHERE ID = '" + id + "'")) {

    if (stockTableModel == null) {
        stockTableModel = new DefaultTableModel();
        for (int col = 0; col < metaData.getColumnCount(); col++) {
            stockTableModel.addColumn(metaData.getColumnName(col + 1));
        }
        jTable.setModel(model);
    }

    while (rs.next()) {
        Vector rowData = new Vector(metaData.getColumnCount());
        for (int col = 0; col < metaData.getColumnCount(); col++) {
            rowData.add(rs.getObject(col + 1));
        }
        stockTableModel.addRow(rowData);
    }

} catch (SQLException exp) {
    exp.printStackTrace();
}