2017-03-08 72 views
1

我在我的GUI應用程序中顯示我的數據庫填充JTable時遇到問題。如何用我的嵌入式數據庫填充我的JTable?

我的代碼如下,並創建一個面板的GUI,然後創建我的JTable並將其添加到我的應用程序。然後我運行一個可能填充表的方法。填充完成後,沒有任何顯示。

解剖我的代碼,我導致相信某處導致數據不解析到我的表中,出於某種未知的原因,這就是我來到這裏的原因。

在一個按鈕的點擊,該代碼需要:

JTable tigerTable = new JTable(); 

JPanel centerPanel = new JPanel(); 

centerPanel.add(tigerTable, new GridBagConstraints()); 

FillTable(tigerTable, "SELECT * FROM TIGER_INFO"); 

的FillTable方法如下:

//Add buildTableModel method 
public void FillTable(JTable table, String Query) 
{ 
    try 
    { 

     Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance(); 
     Connection conn = DriverManager.getConnection("jdbc:derby:STOCK_CONTROL"); 
     Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
     ResultSet rs = stat.executeQuery(Query); 
     System.out.println("Connected"); 

     //Remove previously added rows 
     while (table.getRowCount() > 0) 
     { 
      ((DefaultTableModel) table.getModel()).removeRow(0); 
     } 

     int columns = rs.getMetaData().getColumnCount(); 

     while (rs.next()) 
     { 
      Object[] row = new Object[columns]; 

      for (int i = 1; i <= columns; i++) 
      { 
       row[i - 1] = rs.getObject(i); 
      } 
      ((DefaultTableModel) table.getModel()).insertRow(rs.getRow() - 1, row); 
     } 

     rs.close(); 
     stat.close(); 
     conn.close();   
    } 
    catch (InstantiationException | 
      IllegalAccessException | 
      ClassNotFoundException | 
      SQLException e) 
    { 
     System.out.println(e); 
     e.printStackTrace(); 
    } 
} 

否則,創建應用程序,但不顯示與數據的任何表。我的數據庫包含3列和3行,但我沒有看到我的數據顯示在JTable中。

我的問題是,我如何用我的數據庫填充我的JTable並在我的GUI應用程序上正確顯示它?

如果您需要其他東西,請讓我知道,我會盡我所能提供。

預先感謝您。

回答

0

我已經找到了解決方案 - 我一直試圖繞過這個問題太長時間,我終於修好了。

嘗試先手動設置表模型。

JTable tigerTable = new JTable(); 
tigerTable.setModel(new DefaultTableModel(0, numberOfColumns)); 

當您不指定模型時,JTable將創建一個匿名內部類並且通常不會以您想要的方式工作。

1

我覺得你混合操作,我建議使用此指令:

  1. 創建一個Bean或實體來存儲你的對象
  2. 讓您的數據列表的信息,
  3. 顯示在您的JTable數據,

所以,你可以使用這個在您的JTable來顯示數據:

.... 
List<TIGER_INFO> list = new ArrayList<>();//create a List of data 
while (rs.next()){ 
    //fill data in your List 
    list.add(new TIGER_INFO(rs.getTYPExxx("att1"), rs.getTYPExxx("att2"), rs.getTYPExxx("att3"));   
} 

//when you finish call your function which display your data : 
fillData(list); 
.... 

填寫日期的方法可以是這樣的:

private void fillData(List<TIGER_INFO> list) { 
    DefaultTableModel model = (DefaultTableModel) jTableName.getModel(); 

    while (model.getRowCount() > 0) { 
     for (int i = 0; i < model.getRowCount(); i++) { 
      model.removeRow(i); 
     } 
    } 

    for (TIGER_INFO obj : list) { 
     model.addRow(new Object[]{ 
      obj.getAttribute1(), 
      obj.getAttribute2, 
      obj.getAttribute3 
     }); 
    } 
} 
+0

如何爲我的數據庫表創建一個變量?'String myTable =「TIGER_INFO」'? TIGER_INFO下面有一條紅線。 謝謝。 – juiceb0xk

+0

你的意思是你想在這個查詢中替換你的表的名字'FillTable(tigerTable,「SELECT * FROM TIGER_INFO」);'如果是,你可以創建這個變量並且用這個名字連接它'FillTable(tigerTable,「SELECT * FROM「+ myTable);'如果不解釋更多@ juiceb0xk –

+0

'List list = new ArrayList <>();' - 此時,TIGER_INFO用紅色加下劃線。我假設我們正在從我的表中創建一個數組列表;我如何讓TIGER_INFO變量指向我的TIGER_INFO表? – juiceb0xk

0

我建議寫擴展AbstractTableModel的類。根據SQL語句向該類添加填充內容的函數。然後,它會看起來像:

TigerTableModel tigerModel = new TigerTableModel(dbConnection); 
tigerModel.executeQuery("select * FROM TIGER_INFO"); 
JTable tigerTable = new JTable(tigerModel); 

或創建一個通用TableModel的是能夠運行所有的SQL語句,讓你在你的項目非常靈活。

相關問題