java, собирайте данные из одной JTable, используя обработчик событий изменения отображения другой JTable

Поскольку программа слишком большая, я просто вставлю важные части кода. Вот проблема: у меня есть два JTable. Первый собирает данные из БД и отображает список всех счетов, хранящихся в БД. Цель второй таблицы — когда вы нажимаете на одну строку из таблицы, обработчику событий необходимо собрать целое число из идентификатора столбца. Используя этот идентификатор, вторая таблица будет отображать все конкурсы этого счета (все продукты, хранящиеся в ней).

Первый и второй стол работают отлично. Проблема в том, что я понятия не имею, как я могу собирать определенные данные (в основном мне просто нужен столбец идентификатора) из выбранной строки, а затем с помощью метода, который я уже сделал, обновить второй 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;
    }

На данный момент в правой таблице отображается только содержимое первого счета: введите здесь описание изображения


person vedran    schedule 19.03.2012    source источник


Ответы (1)


С помощью следующего кода вы можете получить значение выбранной щелкнутой ячейки, поэтому вам просто нужно щелкнуть значение ячейки 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);
        }
    });
person swdeveloper    schedule 19.10.2012