1

Derbyデータベースデータを使用してNetbeansGUIビルダーjTableにデータを入力しようとしています。

Account.javaクラスで次のコードを使用しています。

public DefaultTableModel getData() {
    try {
        String stmt = "SELECT * FROM APP.DATAVAULT";
        PreparedStatement ps = Main.getPreparedStatement(stmt);
        ResultSet rs = ps.executeQuery();
        ResultSetMetaData md = rs.getMetaData();
        int columnCount = md.getColumnCount();
        Vector columns = new Vector(columnCount);
        //store column names  
        for (int i = 1; i <= columnCount; i++) {
            columns.add(md.getColumnName(i));
        }

        Vector data = new Vector();
        Vector row;
        while (rs.next()) {

            row = new Vector(columnCount);
            for (int i = 1; i <= columnCount; i++) {
                row.add(rs.getString(i));
            }
            data.add(row);

            //Debugging                
        }

        // List.setModel(tableModel);

        ps.close();
        rs.close();
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
    DefaultTableModel tableModel = new DefaultTableModel(data, columns);
    return tableModel;
}

理想的には、GUI内でこのメソッドを実行することは悪い習慣であると理解しているので、パラメーターデータと列を内部に含むtableModelを返すことができるようにしたいと思います。オンラインのすべてのチュートリアルでは、データを別のクラスに送信する方法は示されていません。GUIクラス内でデータベースコードを実行するだけです。

メソッドの到達不能な部分で宣言および使用されているため、データと列が表示されないというエラーが発生します。これを行った後、これをGUIクラスに渡して、NetbeansGUIビルダーによって作成されたjTableのモデルを設定する方法を見つける必要があります。

私はこのウェブサイトで答えを探していて、多くの解決策を試しました。ただし、システムのコーディング方法が原因で、何も機能しないようです。次のような他のWebサイトも試しました。

http://tips4java.wordpress.com/2009/03/12/table-from-database/

http://chang.advits.com/populate-data-from-database-into-jtable-in-netbeans <これは理想的でしたが、機能しませんでした。ティーショットまでついてきました!

そして、jTable、DefaultTableModel、ResultSetTableModelのJavadocを見てきました-私は、学習などによってこれを自分でやろうとしたことは決してありません...

システムをモデル化した方法でこれを行うにはどうすればよいですか?また、とにかく私の方法を修正するのですか、それとも完全に廃棄する必要がありますか?

4

1 に答える 1

4

したがって、モデルがロードされたことをテーブルに「伝える」方法が必要です。SwingWorkerリスナーのコールバックメカニズムを使用することもできますが、代わりに使用する方が簡単な場合があります。

これにより、バックグラウンドスレッドでデータベースを呼び出すことができ、終了したら、EDT内からUIを更新できます。

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Vector;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTable;
import javax.swing.SwingWorker;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import sun.applet.Main;

public class DataLoadWorker extends SwingWorker<TableModel, TableModel> {

    private final JTable table;

    public DataLoadWorker(JTable table) {
        this.table = table;
    }

    @Override
    protected TableModel doInBackground() throws Exception {
        Vector data = new Vector();
        Vector columns = new Vector();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            String stmt = "SELECT * FROM APP.DATAVAULT";
            ps = Main.getPreparedStatement(stmt);
            rs = ps.executeQuery();
            ResultSetMetaData md = rs.getMetaData();
            int columnCount = md.getColumnCount();
            //store column names  
            for (int i = 1; i <= columnCount; i++) {
                columns.add(md.getColumnName(i));
            }

            columns.ensureCapacity(columnCount);

            Vector row;
            while (rs.next()) {

                row = new Vector(columnCount);
                for (int i = 1; i <= columnCount; i++) {
                    row.add(rs.getString(i));
                }
                data.add(row);

                //Debugging                
            }

            // List.setModel(tableModel);

        } finally {
            try {
                ps.close();
            } catch (Exception e) {
            }
            try {
                rs.close();
            } catch (Exception e) {
            }
        }

        DefaultTableModel tableModel = new DefaultTableModel(data, columns);
        return tableModel;
    }

    @Override
    protected void done() {
        try {
            TableModel model = get();
            table.setModel(model);
        } catch (InterruptedException | ExecutionException ex) {
            ex.printStackTrace();
        }
    }
}

あなたの例も機能しません。

Vectorscolumnsdataは、のコンテキストで宣言されます。try-catchつまり、メソッドの残りの部分には表示されないため、DefaultTableModel tableModel = new DefaultTableModel(data, columns);コンパイルされません。

少なくとも、例外のスタックトレースをダンプする必要があります。これは、実際のエラーがどこにあるかを見つけるのに役立つため、の代わりにSystem.out.println(e.getMessage());を使用する必要がありますe.printStackTrace();。より良い解決策はLogger、JDKまたはのようなサードパーティのロガーのいずれかを使用することlog4jです。

あなたはリソースでもあります。つまり、開いた場合は閉じる必要があります。呼び出しps.close()を行っている間rs.close()、何らかの理由で例外が発生した場合、それらは呼び出されず、リソースは開いたままになります。

finallyこれらをあなたのブロックに追加してtry-catch、それらが閉じていることを確認し、それらを閉じるために最善の努力をしてください。

于 2013-02-28T00:16:30.157 に答える