2014-03-07 32 views
0

我有一个JTable,就是通过我的数据库连接,如何刷新当数据被添加,删除一个JTable,更新

我通过调用这个方法的初始化我的表,

private void initializeRecordsPanel(){ 
    disableAllPanels();   
    lblCityJail = new JLabel("Meycauayan City Jail\r\n"); 
    lblCityJail.setBounds(244, 11, 283, 50); 
    lblCityJail.setForeground(Color.BLACK); 
    lblCityJail.setFont(new Font("Tahoma", Font.BOLD, 25)); 
    recordsPanel.add(lblCityJail); 

    btnRefresh.setVisible(true); 
    try{ 
     connection();     

     String columns [] = { 
       "Last Name", "First Name", "Alias", "Sex", "Case1", "Case2" 
     }; 
     int count = 0 ; 

     while(rs.next()){ 
      count ++; 
     } 

     String datas[][] = new String [count] [7] ; 

     int i=0; 

     connection(); 
     while(rs.next()){ 
      datas[i][0]=rs.getString("lname").toString(); 
      datas[i][1]=rs.getString("fname").toString(); 
      datas[i][2]=rs.getString("alias").toString(); 
      datas[i][3]=rs.getString("sex").toString(); 
      datas[i][4]=rs.getString("case1").toString(); 
      datas[i][5]=rs.getString("case2").toString(); 
      datas[i][6]=rs.getString("ID").toString(); 
      i++; 
     } 


     scrollPane_1 = new JScrollPane(); 

     scrollPane_1.setBounds(48, 104, 650, 314); 
     recordsPanel.add(scrollPane_1); 

     tblListOfInmates = new JTable(datas, columns){ 
      public boolean isCellEditable(int nRow, int nCol) { 
       return false; 
      } 
     }; 

     //TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tblListOfInmates.getModel()); 
     //tblListOfInmates.setRowSorter(sorter); 

     tblListOfInmates.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       try{ 
        int row = tblListOfInmates.getSelectedRow(); 
        Table_click = tblListOfInmates.getModel().getValueAt(row, 6).toString(); 


        if(rs.next()){ 
         addRecord ar = new addRecord(); 
         ar.connection(); 
         ar.setupFrame(); 
         ar.setSelectedRowToTextFields(); 
         ar.edit.setVisible(false); 
         ar.save.setVisible(false); 
         ar.btnEdit.setVisible(true);        
         ar.setTextFieldsEditable(false); 

         mainframe.setEnabled(false); 
         ar.addWindowListener(new WindowAdapter() { 
           public void windowClosing(WindowEvent we) { 
            dispose(); 
            MainFrame.mainframe.setEnabled(true); 
           } 
          }); 
         st.close(); 
         connection(); 
         } 

       }catch(Exception e1){e1.printStackTrace();} 
      } 
      @Override 
      public void mouseEntered(MouseEvent e) { 
       tblListOfInmates.setCursor(new Cursor(Cursor.HAND_CURSOR)); 
      } 
      @Override 
      public void mouseExited(MouseEvent e) { 
       tblListOfInmates.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 
      } 

     }); 
     scrollPane_1.setViewportView(tblListOfInmates); 

     JLabel lblSelectToView = new JLabel("* Select to view full record"); 
     lblSelectToView.setBounds(47, 74, 171, 14); 
     recordsPanel.add(lblSelectToView); 



     st.close(); 
     connection(); 
    }catch(Exception e){e.printStackTrace();} 


    recordsPanel.setVisible(true); 
} 

当我点击一行时,会弹出一个框架并包含我选择的数据。 然后我用这个代码更新表:

try{ 
    connection(); 

    String columns [] = { 
      "Last Name", "First Name", "Alias", "Sex", "Case1", "Case2" 
    }; 
    int count = 0 ; 

    while(rs.next()){ 
     count ++; 
    } 

    String datas[][] = new String [count] [7] ; 

    int i=0; 

    connection(); 
    while(rs.next()){ 
      datas[i][0]=rs.getString("lname").toString(); 
      datas[i][1]=rs.getString("fname").toString(); 
      datas[i][2]=rs.getString("alias").toString(); 
      datas[i][3]=rs.getString("sex").toString(); 
      datas[i][4]=rs.getString("case1").toString(); 
      datas[i][5]=rs.getString("case2").toString(); 
      datas[i][6]=rs.getString("ID").toString(); 
      i++; 
    } 

    scrollPane_1 = new JScrollPane(); 

    scrollPane_1.setBounds(48, 104, 650, 314); 
    recordsPanel.add(scrollPane_1); 



    tblListOfInmates = new JTable(datas, columns){ 
     public boolean isCellEditable(int nRow, int nCol) { 
      return false; 
     } 
    }; 
    scrollPane_1.setViewportView(tblListOfInmates); 

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

表更新成功,但是当我再次连续点击,它给了我这个错误:

java.lang.ArrayIndexOutOfBoundsException: -1 
    at javax.swing.JTable$1.getValueAt(Unknown Source) 
    at RecordManagementSystem.MainFrame$16.mouseClicked(MainFrame.java:805) 
    at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$200(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

在这条线:

Table_click = tblListOfInmates.getModel().getValueAt(row, 6).toString(); 
+1

'scrollPane_1.setBounds (48,104,650,314);'Java GUI可能需要在多种平台上工作,使用不同的屏幕分辨率和使用不同的PLAF。因此,它们不利于组件的准确放置。为了组织强大的图形用户界面,请使用布局管理器或[它们的组合](http://stackoverflow.com/a/5630271/418556)以及[空格]的布局填充和边框(http: //stackoverflow.com/q/17874717/418556)。 –

+0

1)为了更快地获得更好的帮助,请发布[MCTaRE](http://stackoverflow.com/help/mcve)(最小完整测试和可读示例)。 2)不要更新表格,更新模型。其他一切都是自动的。 –

回答

5

有几个问题,你在做什么?

当你加载你的数据,你这样做......

scrollPane_1 = new JScrollPane(); 

scrollPane_1.setBounds(48, 104, 650, 314); 
recordsPanel.add(scrollPane_1); 

tblListOfInmates = new JTable(datas, columns){ 
    public boolean isCellEditable(int nRow, int nCol) { 
     return false; 
    } 
}; 
//... 
scrollPane_1.setViewportView(tblListOfInmates); 

当你更新表,你这样做.. 。

scrollPane_1 = new JScrollPane(); 

scrollPane_1.setBounds(48, 104, 650, 314); 
recordsPanel.add(scrollPane_1); 

tblListOfInmates = new JTable(datas, columns){ 
    public boolean isCellEditable(int nRow, int nCol) { 
     return false; 
    } 
}; 
scrollPane_1.setViewportView(tblListOfInmates); 

第一个问题是,你有没有删除之前的表,所以现在你对对方,意思顶部覆盖部件,你不知道哪个表,你实际上是用互动。

接下来的问题是,你不需要做这一切。只需创建JTable,将其应用于JScrollPane并将其添加到您需要的任何容器中。

当加载数据,创建从数据库中数据的新TableModel的设置为先前创建的JTable模型...

TableModel model = ...; 
//... 
tblListOfInmates.setModel(model); 

这是的Model-View-Control pattern

原则

此:

tblListOfInmates = new JTable(datas, columns){ 
    public boolean isCellEditable(int nRow, int nCol) { 
     return false; 
    } 
}; 

是一个坏主意,在TableModel应该控制什么可以和什么不能EDI特德。

看看How to Use TablesCreating a Table Model更多细节

您还应该使用appropriate layout manager因为你不控制屏幕分辨率,DPI,渲染管线或字体,可能在使用不同的系统,所有这些都将把你的像素完美的布局和变成垃圾...

如果你创建了从数据库中提取的数据的POJO表示,而不是依赖二维数组,那么你可能会发现它更容易,但是这就是我...

MouseListener还担心我......

tblListOfInmates.addMouseListener(new MouseAdapter() { 
    @Override 
    public void mouseClicked(MouseEvent e) { 
     try{ 
      int row = tblListOfInmates.getSelectedRow(); 
      Table_click = tblListOfInmates.getModel().getValueAt(row, 6).toString(); 

      if(rs.next()){ 

通过执行if语句的时候,你已经移动到结果集的结尾......

+0

谢谢您的回答,先生,好的解释。它帮助我很多=) – dens14345

+0

很高兴帮助... – MadProgrammer

0

假设你正在使用一个DefaultTableModel,那么你只是做:

model.setRowCount(0);