【问题标题】:how to set arraylist object to table using OOP concept如何使用 OOP 概念将 arraylist 对象设置为表
【发布时间】: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()

标签: java swing jdbc arraylist jtable


【解决方案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,了解有关如何使用PreparedStatements 的更多详细信息

查看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 也不是一个好选择,同意,工具栏上的 JButtonJMenuBar/JMenuJPopupMenu 中的 JMenuItem 可能是更好的选择,但我时间有限生成基本代码:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多