DB2探検隊(2000/10/12)

 今回は、JTableのセルに、DBに格納されている画像を表示してみます。

 前回はJBuilderのヘルプに書いてある方法でTableModelを作成しようとするとエラーが発生していましたが、今回再チャレンジするとすんなり成功しました。違いは、この操作を行う前にjatax.swing.table.*をインポートしているかどうかのような気がするのですが、未確認。

 サンプルのEMP_PHOTOテーブルは、BLOB型の列に画像が入っているので、これを読み出して表示してみます。いろいろな画像形式で入っているようで、とりあえずGIF形式のものだけを表示します。読み出すのは簡単で、getBlob()メソッドでBlobオブジェクトを作って、getBytes()メソッドでデータを読み出し、ImageIconオブジェクトを作るだけです。(というのが分かるまで、かなり試行錯誤したのですが ^^;)

 実行結果はこんな感じ。

 ソースコードはこんな感じ。TableModelとして、一見DefaultTableModelを使っているようですが、実は違います。ポイントは、getColumnClass()メソッドで、列ごとの型を指定している点です。とりあえずこれで動いているので、よしとしましょう。が、こういう変数名の付け方はまずいです。

package untitled6;

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

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

  class myModel extends DefaultTableModel {
    public Class getColumnClass(int col) {
      try {
        if (0 == col)
          return Class.forName("java.lang.String");
        else
          return Class.forName("javax.swing.ImageIcon");
      } catch (Exception e) {
        return null;
      }
    }
  }

  //フレームの構築
  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(136, 5, 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(10, 37, 382, 236));
    jTable1.setModel(defaultTableModel1);
    defaultTableModel1.addColumn("EMPNO");
    defaultTableModel1.addColumn("EMP_PHOTO");
    contentPane.add(jScrollPane1, null);
    contentPane.add(jButton1, 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) {
    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 rs = stmt.executeQuery("SELECT * FROM EMP_PHOTO");
      int imgHeight = 0;
      while (rs.next()) {
        if (rs.getString(2).equals("gif")) {
          Vector rowData = new Vector();
          rowData.add(rs.getString(1));
          Blob bl = rs.getBlob(3);
          int imgSize = (int)bl.length();
          byte[] imgData = bl.getBytes(1L, imgSize);
          ImageIcon img = new ImageIcon(imgData);
          if (img.getIconHeight() > imgHeight)
            imgHeight = img.getIconHeight();
          rowData.add(img);
          defaultTableModel1.addRow(rowData);
        }
      }
      jTable1.setRowHeight(imgHeight);
      rs.close();
      stmt.close();
      con.close();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

参考文献

  1. 大村忠史, SwingによるJava GUIプログラミングII, カットシステム, 1998年
  2. 吉川和巳, JDBC 2.0 & J2EEによるJavaデータベースプログラミング, IDGジャパン, 2000年

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