如何使用 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,了解有关如何使用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

以上是关于如何使用 OOP 概念将 arraylist 对象设置为表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QObject 派生类实例遵循 OOP 基本概念?

OOP的概念和基础特性

OOP 1.5 类和对象的基本概念与用法1

PHP的面向对象编程思想

java中list和arraylist的区别

面向对象(OOP)基本概念