【问题标题】:java, collect data from one JTable, using event handler change display of other JTablejava,从一个JTable收集数据,使用事件处理程序更改其他JTable的显示
【发布时间】:2012-03-19 15:53:20
【问题描述】:

由于程序太大,我只粘贴代码的重要部分。这是问题所在: 我有两个JTables。第一个从 DB 收集数据并显示存储在 DB 中的所有发票的列表。第二个表的目的是当您单击表中的一行时,事件处理程序需要从列 ID 中收集整数。使用此 ID,第二个表格将显示该发票的所有竞赛(其中存储的所有产品)。

第一张和第二张桌子完美无缺。问题是我不知道如何从选定的行中收集某些数据(我基本上只需要 ID 列),然后通过我已经使用新信息更新第二个 JTable 的方法。如果有帮助,这是我的代码:

(PS:一旦我学会了如何做到这一点,当我选择不同的行时,左侧的列表是否会默认每次更改,还是需要使用验证/重新验证方法?)

public JPanel tabInvoices() {
        JPanel panel = new JPanel(new MigLayout("", "20 [grow, fill] 10 [grow, fill] 20", "20 [] 10 [] 20"));

        /** Labels and buttons **/
        JLabel labelInv = new JLabel("List of all invoices");
        JLabel labelPro = new JLabel("List of all products in this invoice");

        /** TABLE: Invoices **/
        String[] tableInvTitle = new String[] {"ID", "Date"};
        String[][] tableInvData = null;
        DefaultTableModel model1 = new DefaultTableModel(tableInvData, tableInvTitle);
        JTable tableInv = null;
        /** Disable editing of the cell **/
        tableInv = new JTable(model1){
            public boolean isCellEditable(int r, int c) {
                return false;
            }
        };
        /** Load the invoices from DB **/
        List<Invoice> listInv = is.getAllInvoices();
        for (int i = 0; i < listInv.size(); i++) {
            model1.insertRow(i, new Object[] {
                    listInv.get(i).getID(),
                    listInv.get(i).getDate()
            });
        }

        /** TABLE: Invoice Info **/
        String[] tableInfTitle = new String[] {"ID", "Name", "Type", "Price", "Quantity"};
        String[][] tableInfData = null;
        DefaultTableModel model2 = new DefaultTableModel(tableInfData, tableInfTitle);
        JTable tableInf = null;
        /** Disable editing of the cell **/
        tableInf = new JTable(model2){
            public boolean isCellEditable(int r, int c) {
                return false;
            }
        };
        /** Load the products from DB belonging to this invoice **/
        List<Product> listPro = is.getInvoiceInfo(1); // Here's where I need the ID fetched from selected row. For now default is 1.
        for (int i = 0; i < listPro.size(); i++) {
            model2.insertRow(i, new Object[] {
                    listPro.get(i).getID(),
                    listPro.get(i).getName(),
                    listPro.get(i).getType(),
                    listPro.get(i).getPrice(),
                    listPro.get(i).getQuantity()
            });
        }


        /** Scroll Panes **/
        JScrollPane scrollInv = new JScrollPane(tableInv);
        JScrollPane scrollPro = new JScrollPane(tableInf);

        panel.add(labelInv);
        panel.add(labelPro, "wrap");
        panel.add(scrollInv);
        panel.add(scrollPro);

        return panel;
    }

目前,右表仅显示第一张发票的内容:

【问题讨论】:

    标签: java swing jtable actionlistener


    【解决方案1】:

    借助以下代码,您可以获得所选点击单元格的值,因此您只需单击ID 单元格值(您想在第二个表中查看其产品的发票 ID)并借助在事件处理程序之后,您将获得该值,然后您可以根据该 ID 获取数据并设置为第二个表。 (在下面的代码中,table 是您的第一个表的对象)

    (当然,您也必须应用一些验证,以检查选定(并单击)的单元格是 ID 而不是 DATE

        table.addMouseListener(new MouseAdapter() {
    
            @Override
            public void mouseClicked(MouseEvent e) {
    
                int row = table.rowAtPoint(e.getPoint());
                int col = table.columnAtPoint(e.getPoint());
    
                Object selectedObj = table.getValueAt(row, col);
    
                JOptionPane.showMessageDialog(null, "Selected ID is " + selectedObj);
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多