2012-03-19 13 views
0

由於程序太大,我只需粘貼代碼的重要部分。這裏的問題: 我有兩個JTable s。首先從DB收集數據並顯示存儲在數據庫中的所有發票清單。第二個表的目的是當您從表中單擊一行時,事件處理程序需要從列ID收集整數。使用這個ID,第二個表格將顯示該發票的所有比賽(所有存儲在其中的產品)。java,從一個JTable收集數據,使用其他JTable的事件處理程序更改顯示

第一張和第二張桌子完美地工作。問題是我不知道如何從選定的行中收集某些數據(我基本上只需要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; 
    } 

現在,右表只顯示了第一張發票的內容: enter image description here

回答

0

隨着下面的代碼的幫助下,你可以得到選擇單擊的單元格的值,所以你只需要點擊在ID單元格值(您希望在第二個表中查看其產品的發票ID) d在以下事件處理程序的幫助下,您將獲得該值,然後您可以根據該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); 
     } 
    });