0

私が取り組んでいるプログラムには、GUI と DatabaseHelper の 2 つのクラスが含まれています。使用されるテーブル モデルは DefaultTableModel です。

GUI には、単純な JTable が含まれています。起動時に DatabaseHelper からのデータで初期化されます。これは機能します。

ただし、新しいデータをテーブルにロードしようとすると、それほど単純ではありません。

これまでの私のアプローチは次のとおりです。

model = DatabaseHelper.LoadData() // returns a default table model with new data.
tabel = new JTable();
tabel.setModel();

これで、ロードされたデータが既存の JTable に追加されます。

可能であれば、デフォルトのテーブル モデルのみを使用してソリューションを実装したいと考えています。ご提案ありがとうございます。

編集:

public void initGUI(){

        setJMenuBar(makeMenuBar()); 
        container   = new JPanel(new BorderLayout());

        model = db.initialiseTable();       // Load initialisation data from the database

        table = new JTable();
        table.setModel(model);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);
        scrollPane  = new JScrollPane(table);

        container.add(scrollPane, BorderLayout.CENTER); 
        add(container);
    }

データベースから新しいモデルを返す:

public DefaultTableModel loadData(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/version1", "root", "root");
            System.out.println("\nDatabase Connection Established.\n");

            String query = "SELECT * FROM table WHERE test_number = 2";

            stmt        = con.createStatement();
            rs          = stmt.executeQuery( query );

            md          = rs.getMetaData();
            columns     = md.getColumnCount();  

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

                for (int i = 1; i <=columns-1; i++){
                row.addElement( rs.getObject(i+1) );
                }
                data.addElement( row );
            }
        }catch(SQLException e){
            e.printStackTrace();
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }

        columnNames.add(" ");
        columnNames.add("Column 1");
        columnNames.add("Column 2");

        DefaultTableModel model = new DefaultTableModel(data, columnNames);

        return model;
    }

ActionPerformed、コードは DatabaseHelper から返された新しいモデルを処理します

            model = new DefaultTableModel();
            model = db.loadData();

            table = new JTable();
            table.setModel(model);
4

3 に答える 3

1

にバグがある可能性がありDatabaseHelper.LoadData()ます。何らかの理由で、新しいモデルは作成されませんが、常に同じモデルが返されます。

で新しいモデルを作成するDatabaseHelper.LoadData()と、機能するはずです。

于 2012-09-14T10:24:40.183 に答える
1
model = DatabaseHelper.LoadData() // returns a default table model with new data.
tabel = new JTable();
tabel.setModel();
  • TableModelre_createおよびという最も重要な問題がある可能性がありJTable、この新しいJTableインスタンスTableModelは に追加されGUIません。そうしないでください。本当の理由はありません ...

  • の検索ResulsetTableModel(そこにのみ渡すSQL Query)またはデータベースからの優れたコード テーブルを使用するには@camickr

于 2012-09-14T11:40:06.187 に答える
0

まず、アクション ハンドラーに追加のインスタンス化があるようです。

        model = new DefaultTableModel();
        model = db.loadData();

        table = new JTable();
        table.setModel(model);

loadDataメソッドは a をインスタンス化するDefaultTableModelので、 をスキップできます。またnew DefaultTableModel、既にメソッドJTableから を持っているinitGuiので、既存の を参照するだけですComponent

これで、オブジェクトに追加しているだけのように見えcolumnNamesます。おそらく、毎回それをクリアするか、再インスタンス化する必要がありますか? loadData複数回呼び出される場合columnNamesは、メソッドの外で作成する方がクリーンloadDataです。そこに " "、"Column 1"、"Column 2" を追加し、内部でのみ参照しますloadData

于 2012-10-01T18:35:04.310 に答える