DB2探検隊(2000/10/08)

 今回も、DB2探検隊(2000/10/06)のちょっとした変更のみ。テキストエリアではなくJTableに結果を表示しようと考えて、少し試行錯誤しました。前の経験から画面にスクロールペインをおいて、その中にJTableを貼るところまでは簡単なんですが、そこから先が面倒です。

 [1]の前の方をちょろっと読んで、TableModelを作る必要があることがわかりました。が、JBuilderのヘルプに書いてある方法でTableModelを登録しようとしても、エラーが出てできません。こういう、したいことが分かっているのに、それをGUIでどう操作したらいいか分からないというのは、本当にいらいらしますよね。

 GUI操作はあきらめて、エディタでDefaultTableModelを生成するコードを作りました。サンプルを写したのでよく分からないところもあるのですが、経験値が上がるまではとりあえずよしとしましょう。で、JTableにデータを表示するにはモデルにデータを登録すればよいことが分かりました。モデルへの登録には、addRow()メソッドでVectorと配列を使う方法があるので、まず簡単に配列を使って確認しました。OKです。次に、Vectorを使う方法を次のコメントになっているようにして確認したところ、ううむ、値がすべて同じになってしまいます。addRowメソッドの処理内容が違うんですね。whileループ内で、毎回Vectorを作る必要がありました。

package test2;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import java.sql.*;
import java.util.*;

public class Frame1 extends JFrame {
  JPanel contentPane;
  JButton jButton1 = new JButton();
  JScrollPane jScrollPane1 = new JScrollPane();
  JTable jTable1 = new JTable();

  String[] columnNames = {"EMPNO", "FIRSTNAME"};
  DefaultTableModel tblModel = new DefaultTableModel(columnNames, 0);

  //フレームの構築
  public Frame1() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  //コンポーネントの初期化
  private void jbInit() throws Exception  {
    jButton1.setText("検索開始");
    jButton1.setBounds(new Rectangle(156, 9, 88, 27));
    jButton1.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        jButton1_actionPerformed(e);
      }
    });
    contentPane = (JPanel) this.getContentPane();
    contentPane.setLayout(null);
    this.setSize(new Dimension(400, 300));
    this.setTitle("フレーム タイトル");
    jScrollPane1.setBounds(new Rectangle(27, 41, 343, 211));

    jTable1.setModel(tblModel);
    jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    JTableHeader header = jTable1.getTableHeader();
    header.setUpdateTableInRealTime(true);

    contentPane.add(jButton1, null);
    contentPane.add(jScrollPane1, null);
    jScrollPane1.getViewport().add(jTable1, null);
  }

  //ウィンドウが閉じられたときに終了するようにオーバーライド
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }

  void jButton1_actionPerformed(ActionEvent e) {
//    Vector rowData = new Vector();
    String[] rowData = {"", ""};
    Connection con = null;
    String url = "jdbc:db2:sample";

    try {
      Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");
      con = DriverManager.getConnection(url);
      Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
      ResultSet rs = stmt.executeQuery("SELECT * FROM employee");
      rs.afterLast();
      while (rs.previous()) {
//          rowData.clear();
//          rowData.add(rs.getString(1));
//          rowData.add(rs.getString(2));
          rowData[0] = rs.getString(1);
          rowData[1] = rs.getString(2);
          tblModel.addRow(rowData);
      }
      rs.close();
      stmt.close();
      con.close();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

 この内容では、DB2探検というよりSwingの使い方を巡る試行錯誤といった方が適切ですが・・・

参考文献

  1. 大村忠史, SwingによるJava GUIプログラミングII, カットシステム, 1998年

[DB2探検隊の目次] [ホーム]