如何使用 OOP 概念将 arraylist 对象设置为表
Posted
技术标签:
【中文标题】如何使用 OOP 概念将 arraylist 对象设置为表【英文标题】:how to set arraylist object to table using OOP concept 【发布时间】:2015-12-13 21:53:15 【问题描述】:我在从 DB 获取值的方法中创建了一个 OrderModel
对象,并将其设置为 JTable
。我想知道如何使用此代码将此创建的对象设置为JTable
:
tblOrderItems.setModel(DbUtils.resultSetToTableModel());
这是我的代码:
private void tblOrderListMouseClicked(java.awt.event.MouseEvent evt)
int raw = tblOrderList.getSelectedRow();
OrderModel or;
String item;
Double qty,amount,total;
ArrayList<OrderModel> arrOrder = new ArrayList<OrderModel>();
String selectedRaw = tblOrderList.getModel().getValueAt(raw, 0).toString();
String sql = "select item,qty,amount from orderdetails where orderid='"+selectedRaw+"'";
con = new DBconnector().connect();
try
ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if(rs.next())
or = new OrderModel();
or.setItem(rs.getString("item"));
or.setQty(rs.getDouble("qty"));
or.setAmount(rs.getDouble("amount"));
arrOrder.add(or);
DefaultTableModel tblModel = new DefaultTableModel();
// wanted to set ArrayList to table+
tblOrderItems.setModel(DbUtils.resultSetToTableModel());
catch (Exception e)
e.printStackTrace();
【问题讨论】:
使您的OrderModel
扩展AbstractTableModel
并在setModel
方法中使用or
作为参数
因为每个OrderModel
都是一行,所以你需要一个TableModel
实现来管理这些
@MadProgrammer 是正确的。您必须创建一个表模型类,然后将行添加到该表模型并将 jtable 的模型设置为该表模型
我没有任何抽象类。我们不能在这段代码上做吗?
什么是DbUtils
?它是一个自定义类吗?如果是,则发布方法的代码resultSetToTableModel()
【参考方案1】:
首先创建您自己的TableModel
,它可以管理您的OrderModel
类,它代表表中的单个行...
public static class OrderTableModel extends AbstractTableModel
protected static final String[] COLUMN_NAMES = "Item", "Qty", "Amount";
private List<OrderModel> rows;
public OrderTableModel(List<OrderModel> rows)
this.rows = new ArrayList<>(rows);
@Override
public int getRowCount()
return rows.size();
@Override
public int getColumnCount()
return COLUMN_NAMES.length;
@Override
public String getColumnName(int column)
return COLUMN_NAMES[column];
@Override
public Object getValueAt(int rowIndex, int columnIndex)
Object value = null;
OrderModel row = rows.get(rowIndex);
switch (columnIndex)
case 0:
value = row.getItem();
break;
case 1:
value = row.getQty();
break;
case 2:
value = row.getAmount();
break;
return value;
然后你可以使用类似...
private void tblOrderListMouseClicked(java.awt.event.MouseEvent evt)
int raw = tblOrderList.getSelectedRow();
OrderModel or;
String item;
Double qty, amount, total;
ArrayList<OrderModel> arrOrder = new ArrayList<OrderModel>();
String selectedRaw = tblOrderList.getModel().getValueAt(raw, 0).toString();
String sql = "select item,qty,amount from orderdetails where orderid=?";
con = new DBconnector().connect();
try (PreparedStatement ps = con.prepareStatement(sql))
ps.setString(1, selectedRaw);
try (ResultSet rs = ps.executeQuery())
while (rs.next())
or = new OrderModel();
or.setItem(rs.getString("item"));
or.setQty(rs.getDouble("qty"));
or.setAmount(rs.getDouble("amount"));
arrOrder.add(or);
OrderTableModel model = new OrderTableModel(arrOrder);
tblOrderItems.setModel(model);
catch (SQLException e)
e.printStackTrace();
简单地加载ArrayList
中的项目,然后将其传递给OrderTableModel
的实例,然后应用到JTable
查看How to Use Tables,了解有关使用您自己的自定义模型的更多详细信息。
请查看Using Prepared Statements,了解有关如何使用PreparedStatement
s 的更多详细信息
查看The try-with-resources Statement,了解有关如何更好地管理数据库(和其他)资源的更多详细信息
【讨论】:
你知道rxj2xml.jar吗? 不,从我所看到的一切来看,这比它更值得。基本上,它需要一个ResultSet
并生成一个TableModel
,你无法进一步控制它
@MadProgrammer 我认为不是一个好的答案,然后是两个问题(我不希望得到一个(y)答案)1.为什么要回答一个从不发布 SSCCE 的 OP 的问题,2.a)int raw 应该被测试,如果是 grather than -1, 2 b.) mouseClicked(来自 3-5 个鼠标按钮的所有事件:-) 非常脆弱(EDT 与来自/到 SQL 解释器的性能),我会使用弹出窗口从鼠标右键使用 Runnable#Thread(从 SwingWorker 中享受)用于 JDBC
@mKorbel 不,我肯定不会将 JDBC 调用放在生产环境中的 EDT 中,这是真的。不可能为基于 JDBC 的问题提供一个可运行的示例,并且代码可以很好地了解他们正在尝试做什么。 MouseClicked
也不是一个好选择,同意,工具栏上的 JButton
或 JMenuBar
/JMenu
或 JPopupMenu
中的 JMenuItem
可能是更好的选择,但我时间有限生成基本代码:P以上是关于如何使用 OOP 概念将 arraylist 对象设置为表的主要内容,如果未能解决你的问题,请参考以下文章