java - 为什么在将值设置到 JTable 时要扩展 AbstractTableModel?

标签 java swing oop

我正在开发一个用于订购系统的应用程序,我必须将数据设置到 JTabels 中。 这段代码运行成功。我想知道这个类的重要性以及发生了什么? 为什么我们需要导入AbstractTabelModel.class?

OrderTabelModel 类:-

  public class OrderTableModel extends AbstractTableModel{
    protected static final String[] COLUMN_NAMES={"Item","Qty","Amount"};
       private List<Order> rows;

    public OrderTableModel(List<Order> 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;
            Order 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;
        }



    }

这是其他类(class)

private void tblOrderListMouseClicked(java.awt.event.MouseEvent evt) {                                          
      int raw = tblOrderList.getSelectedRow();
      Order or;
      String item;
      Double qty,amount,total;

      ArrayList<Order> arrOrder = new ArrayList<Order>();

      String selectedRaw = tblOrderList.getModel().getValueAt(raw, 0).toString();
      System.out.println("order id : "+selectedRaw);
      String sql = "select item,qty,amount from orderdetails where orderid='"+selectedRaw+"'";
      con = new DBconnector().connect();
        try {
            Statement   ps =con.createStatement();
            ResultSet rs2 = ps.executeQuery(sql);
           while(rs2.next()){
                or = new Order();
                or.setItem(rs2.getString("item"));
                System.out.println("Item :" +rs2.getString("item"));
                or.setQty(rs2.getDouble("qty"));
                or.setAmount(rs2.getDouble("amount"));

                arrOrder.add(or);
            }
            rs2.close();
            ps.close();
            OrderTableModel tblModel = new OrderTableModel(arrOrder);          
            tblOrderItems.setModel(tblModel);


        } catch (Exception e) {
            e.printStackTrace();
        }

    }                                         

有人可以向我解释一下这个过程吗?

最佳答案

并不总是强制扩展AbstractTableModel。您可以简单地扩展 DefaultTableModel 并仅在必要时重写 getValueAt() 方法。

但大多数情况下,对于简单用法,甚至不需要重写 getValueAt() 方法。

通过使用 DefaultTableModel,将数据(从数据库导入)转换为 object[][]Vector 类型(可能是有点无聊。

但是您问使用 AbstractTabelModel 的重要性是什么?

在这种情况下,我可以说当开始渲染 JTable 时,它需要确定行数和列数,并且还需要知道每个中应该重新渲染哪些数据细胞等。基于此,JTable 从底层 TableModel 请求此信息。因此,您的 TableModel(TableModel 的任何子级或实现)需要具有 JTable 使用的那些方法来检索所需的信息。

希望这会有所帮助。

祝你好运。

关于java - 为什么在将值设置到 JTable 时要扩展 AbstractTableModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32711602/

相关文章:

java - JSCH依次执行并打印命令输出

java - 包含给出错误结果

java - 无法在 GUI 中显示小计、总计和销售税

java - 如何在 main 中的可运行对象之外对 JFrame GUI 进行更改?

c++ - 对象在将其指针转换为基数后未调用好的方法

java - 在内部类中执行main方法

java - Java中带有全局变量的抽象类没有设置?

java - 在 paintComponent 中绘制另一个组件

c++ - 返回其自身类型的模板类方法的正确签名

perl - Perl Moose类设计