将数据从JDBC显示为JTable

时间:2012-12-03 14:51:30

标签: java swing jdbc jtable

我已经在本网站上关注了一些关于在表格中显示数据库信息的建议,但是我仍然无法工作。我有一个生成的Netbeans对话框,其中有一个名为mainTable的表,我将Model设置为一个从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生成的类。

1 个答案:

答案 0 :(得分:2)

看起来你正在将TableModel传递给错误的JTable,而不是当前可视化的AddressBookGui实例所持有的JTable。这不起作用(正如你所发现的那样),因为设置新创建的AddressBookGui实例的JTable对可视化对象完全没有影响,因为它们是同一个类的实例,它们彼此独立。解决方案是将此模型传递到由实际可视化的AddressBookGui实例保存的JTable中。注意一个糟糕的解决方案是使用静态字段。只是不要这样做。

修改
我认为你的问题是错误的继承错误,再次设置了非可视化JTable的模型。我怀疑你的代码行gui.main(null)调用一个静态主方法来创建和显示一个AddressBookGui实例,并且这个人拥有你的JFrame。如果是这样,那么它显示的这个AddressBookGui实例与gui变量持有的实例相同。

我建议你没有AddressBookImpl扩展AddressBookGui,而是让它只是持有一个AddressBookGui的实例,而你不是调用AddressBookGui的main方法而是让AddressBookImpl负责显示它的 AddressBookGui实例