2012-12-03 69 views
0

我已經按照此網站上的一些關於在表中顯示數據庫信息的建議,但是我的工作仍然不起作用。我有一個名爲mainTable的表生成Netbeans對話框,我將模型設置爲從MySql獲取的ResultSet。將JDBC中的數據顯示到JTable中

編輯整個類:

import swing.SwingUtilities; 
import javax.java.awt.Dialog; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 
import java.util.Vector; 

import javax.swing.JDialog; 
import javax.swing.JOptionPane; 

swing.table.DefaultTableModel; 

public class AddressBookImpl extends AddressBookGui implements ActionListener { 
final static AddressBookImpl impl = new AddressBookImpl(); 
DefaultTableModel defaultTableModel = new DefaultTableModel(); 
AddressBookGui gui = new AddressBookGui(); 



public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override public void run() { impl.startGUI(); }}); 
} 

public void startGUI(){ 
    gui.main(null); 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    this.setResizable(true); 
    this.setTitle("Address Book"); 
    listeners(); 
    refreshTable(); 
} 

public DefaultTableModel refreshTable() { 
    try{ 

     DatabaseImpl dbimpl = new DatabaseImpl(); 
     dbimpl.refreshDatabase(); 
     ResultSet refreshResult = dbimpl.refreshResult; 
     ResultSetMetaData meta = refreshResult.getMetaData(); 
     int numberOfColumns = meta.getColumnCount(); 

     while (refreshResult.next()) 
     { 
      Object[] rowData = new Object[numberOfColumns]; 

      for (int i = 0; i < rowData.length; ++i) 
      { 
       rowData[i] = refreshResult.getObject(i + 1); 
      } 
      defaultTableModel.addRow(rowData); 
     } 
     this.defaultTableModel = defaultTableModel; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    gui.mainTable.setModel(defaultTableModel); 
    return defaultTableModel; 
} 


public void listeners() { 
    quitFileMenuBar.addActionListener(this); 
    addButton.addActionListener(this); 
    refreshButton.addActionListener(this); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    if (e.getActionCommand().equalsIgnoreCase("Quit")) 
    { 
     this.dispose(); 
    } 
    if (e.getActionCommand().equalsIgnoreCase("Add")) 
    { 
     // Add a new address to the DB 
    } 
    if (e.getActionCommand().equalsIgnoreCase("About")) 
    { 

    } 
    if (e.getActionCommand().equalsIgnoreCase("Refresh")) 
    { 
     refreshTable(); 
     System.out.println("Refreshing........"); 
    } 
} 
} 

而且DatabaseImpl類:

protected ResultSet refreshDatabase() { 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     con = DriverManager.getConnection(url, user, password); 
     System.out.println("Connection is created to " + url); 

     Statement statement = con.createStatement(); 
     String selectAllQuery = "Select * from " + table + ";"; 

     ResultSet refreshResult = statement.executeQuery(selectAllQuery); 
//   con.close(); 
     this.refreshResult = refreshResult; 
     return refreshResult; 

    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return refreshResult; 
} 

然而,這只是顯示一個空白區域所在的表應該是,任何幫助嗎?

GUI類是一個沼澤標準netbeans生成的類。

+0

你的代碼需要一些重構...是'AdderssBookGui'表顯示表的對話框?爲什麼在設置'TableModel'之後直接放置它?或者獲取由這個方法的調用者設置的'TableModel'(因爲你正在返回TableModel)? – Kai

+0

AddressBookGui是對話框是的,我刪除了配置,但仍然無法正常工作,我試圖將TableModel直接添加到AddressBookGui類中,但這意味着要調用此方法,並且因爲這會擴展該類,所以它被卡住循環,並給了我一個堆棧溢出錯誤。 –

+0

這是連接到數據庫,獲得ResultSet工作正常,並且rowData保存在數據庫中的信息,它只是不適用於JTable。 –

回答

2

它看起來像是將TableModel傳遞給錯誤的JTable,轉換成不被當前可視化的AddressBookGui實例持有的JTable。由於設置新創建的AddressBookGui實例的JTable對可視化對象完全沒有影響,因爲它們是同一類的實例,所以這不起作用(正如您發現的那樣),它們彼此獨立。解決方案是將這個模型傳遞給由實際可視化的AddressBookGui實例持有的JTable。注意一個不好的解決方案是使用靜態字段。只是不要這樣做。

編輯
我覺得你的問題是與繼承的一個令人費解的誤用和重新設置一個非可視化的JTable的模型。我懷疑你的代碼行gui.main(null)調用一個靜態主方法來創建並顯示一個AddressBookGui實例,並且這個人持有你的JFrame。如果是這樣,那麼它正在顯示的這個AddressBookGui實例是而不是與gui變量所持有的相同。

我建議你最好不要有AddressBookImpl延長AddressBookGui,而是有它只需持有AddressBookGui的實例,你不叫AddressBookGui的主要方法,而是有AddressBookImpl負責顯示 AddressBookGui實例。

+0

對不起,我有點困惑,我刪除了.setmodel(....);來自GUI類,並且在該類可視化之前調用該方法。 –

+0

@MattC:然後向我們展示您實際將創建的模型添加到可視化JTable的位置。 –

+0

@MATC:我想我理解你的問題和解決方案。請參閱上面的編輯來回答。 –