【发布时间】:2012-12-03 14:51:29
【问题描述】:
我已遵循此站点上有关在表格中显示数据库信息的一些先前建议,但我的仍然无法正常工作。我有一个生成的 Netbeans 对话框,其中包含一个名为 mainTable 的表,我将模型设置为从 MySql 获取的 ResultSet。
编辑整个班级:
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 生成的类。
【问题讨论】:
-
您的代码需要重构...
AdderssBookGui是显示表格的对话框吗?为什么设置TableModel后直接丢弃?或者获取该方法的调用者设置的TableModel(因为你返回的是TableModel)? -
AddressBookGui 是对话框,是的,我删除了 dispose 但仍然无法正常工作,我试图将 TableModel 直接添加到 AddressBookGui 类中,但这意味着调用此方法,并且随着它的扩展那个类它陷入了一个循环并给了我一个堆栈溢出错误。
-
那是连接到数据库,获取 ResultSet 工作正常,rowData 保存了数据库中的信息,它只是不适用于 JTable。
-
如需尽快获得更好的帮助,请发帖SSCCE。
-
哪里有设置 GUI 可见的代码,即
setVisible(true)?为什么 AddressBookImpl 扩展 AddressBookGui?gui.main(null);的目的是什么?您在这里使用继承看起来有问题,您可能不应该使用这种继承。