Java 如何将项目列表到JTable
我正在尝试为我的课程创建一个结帐模拟。因此,每次我搜索一个项目时,我都可以从数据库中检索它并将其显示在JTable上。但是,一旦我将一个项目添加到列表中并尝试添加另一个项目,旧项目就会被新项目替换 我试图列出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
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();
}