0

データベース情報をテーブルに表示することについて、このサイトで以前のアドバイスに従いましたが、それでも機能しません。mainTableという名前のテーブルを使用して生成されたNetbeansダイアログがあり、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クラスは、bog標準のnetbeansで生成されたクラスです。

4

1 に答える 1

2

現在視覚化されている AddressBookGui インスタンスによって保持されていない間違った JTable に TableModel を渡しているようです。新しく作成された AddressBookGui インスタンスの JTable を設定しても、同じクラスのインスタンスである間は互いに独立しているため、視覚化されたオブジェクトにはまったく影響がないため、これは機能しません (ご存じのとおり)。解決策は、実際に視覚化された AddressBookGui インスタンスが保持する JTable にこのモデルを渡すことです。悪い解決策は、静的フィールドを使用することです。これをしないでください。

編集
あなたの問題は、継承の複雑な誤用と、視覚化されていない JTable のモデルの設定にあると思います。あなたのコード行はgui.main(null)、AddressBookGui インスタンスを作成して表示する static main メソッドを呼び出しており、この男があなたの JFrame を保持していると思われます。その場合、表示されているこの AddressBookGui インスタンスは、gui 変数によって保持されているものと同じではありません。

AddressBookImpl で AddressBookGui を拡張するのではなく、単純に AddressBookGui のインスタンスを保持し、AddressBookGui のメイン メソッドを呼び出すのではなく、AddressBookImpl にそのAddressBookGui インスタンスの表示を任せることをお勧めします。

于 2012-12-03T14:56:14.223 に答える