Java/swing/サンプル/Zipファイル解凍サンプル JTableに一覧表示、ダブルクリックで画像を表示



  • SwingによるZipファイル解凍サンプル
  • Zipファイルをドラッグ&ドロップで受け取り、JTabelにファイルの一覧を表示します。
  • 画像ファイルをダブルクリックすると、バイト配列に解凍し画像を表示します。
  • ApacheのCommons Compressを使用しています。

サンプルダウンロード


サンプルソース

// SwingによるZipファイル解凍サンプル
// Zipファイルをドラッグ&ドロップで受け取り、JTabelにファイルの一覧を表示します。
// 
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.List;
 
import javax.swing.*;
import javax.swing.table.*;
 
import org.apache.commons.compress.archivers.zip.*;
 
public class ZipSwingSample extends JFrame {
 
  public static void main(String[] args) throws Exception {
    new ZipSwingSample();
  }
 
  JTable tbl;
  DefaultTableModel model;
  ZipFile zipFile;
 
  public ZipSwingSample() throws Exception {
    setTitle("Zipファイルをドロップしてください");
    setBounds(200, 100, 300, 200);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
 
    // ドロップターゲット設定
    new DropTarget(this, DnDConstants.ACTION_COPY, new MyDropTargetListener());
 
    // JTable初期化
    initTable();
 
    setVisible(true);
  }
 
  // テーブルを初期化
  private void initTable() {
    // モデルを生成
    model = new DefaultTableModel();
    // カラム名ほ設定
    model.setColumnIdentifiers(new String[] { "ファイル名", "圧縮サイズ", "解凍サイズ" });
 
    // テーブルモデルからJTableを作成
    tbl = new JTable(model) {
      // 編集禁止のオマジナイ
      @Override
      public boolean isCellEditable(int row, int column) {
        return false;
      }
    };
 
    // 圧縮ファイルサイズ、ファイルサイズの表示列に右寄せセルレンダラーを設定
    DefaultTableCellRenderer render = new DefaultTableCellRenderer();
    render.setHorizontalAlignment(DefaultTableCellRenderer.RIGHT);
    tbl.getColumnModel().getColumn(1).setCellRenderer(render);
    tbl.getColumnModel().getColumn(2).setCellRenderer(render);
    // JTableをフレームに追加
    add(new JScrollPane(tbl));
 
    // zipの中の画像をダブルクリックしたら画像を表示します。
    tbl.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) {
          showImage(tbl.rowAtPoint(e.getPoint()));
        } else {
          super.mouseClicked(e);
        }
      }
 
    });
  }
 
  // 画像を表示するメソッド
  private void showImage(int idx) {
    // エントリ取得
    ZipArchiveEntry ze = (ZipArchiveEntry) model.getValueAt(idx, 0);
    // 画像ファイル以外は無視します
    String name = ze.getName().toLowerCase();
    if (name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".png")
        || name.endsWith(".gif")) {
      try {
        // エントリを使ってインプットストリームを取得
        InputStream is = zipFile.getInputStream(ze);
        // zipファイルから画像ファイルをバイト配列に展開
        int total = (int) ze.getSize();
        byte[] b = new byte[total];
        int readSize;
        int now = 0;
        while ((readSize = is.read(b, now, total - now)) > 0) {
          now += readSize;
        }
        // 画像ファイルを読み込んだバイト配列でイメージアイコン作成
        ImageIcon icon = new ImageIcon(b);
        // デスクトップのサイズを取得
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        int x = 220;
        int y = 120;
        // ウィンドウの高さ設定
        int h = icon.getIconHeight() + 30;
        if (h > d.height) {
          y = 0;
          h = d.height;
        }
        // ウィンドウの幅設定
        int w = icon.getIconWidth() + 8;
        if (w > d.width) {
          x = 0;
          w = d.width;
        }
 
        // 画像表示用フレーム作成
        JFrame f = new JFrame();
        f.setTitle(ze.getName());
        f.setBounds(x, y, w, h);
        // アイコンをJLabelで包んでフレームに設定
        f.add(new JLabel(icon));
        // 画像表示用フレーム表示
        f.setVisible(true);
      } catch (IOException e1) {
        e1.printStackTrace();
      }
    }
  }
 
 
  // zipファイルをテーブルに設定
  void setZipFile(String zipPath) throws Exception {
    if (zipFile != null) {
      zipFile.close();
      while (model.getRowCount() != 0) {
        model.removeRow(0);
      }
    }
 
    // ZipFileオープン
    // 文字コードはシステムデフォルトの文字コードにしておきます
    // Windows7だとMS932でした
    zipFile = new ZipFile(zipPath, System.getProperty("file.encoding"));
    // エントリ取得
    Enumeration<? extends ZipArchiveEntry> entries = zipFile.getEntries();
    // エントリの数だけループ
    while (entries.hasMoreElements()) {
      // ZipArchiveEntryを取得
      ZipArchiveEntry e = entries.nextElement();
      model.addRow(new Object[] { e, String.format("%,3d", e.getCompressedSize()),
          String.format("%,3d", e.getSize()) });
    }
  }
 
  // ドラッグ&ドロップ用 ドロップターゲットリスナー
  // ドロップされたファイルを受け取り、最初のファイルだけTableに表示します
  class MyDropTargetListener extends DropTargetAdapter {
    @Override
    public void drop(DropTargetDropEvent dtde) {
      dtde.acceptDrop(DnDConstants.ACTION_COPY);
      boolean b = false;
      try {
        b = true;
        List<File> list = (List<File>) dtde.getTransferable().getTransferData(
            DataFlavor.javaFileListFlavor);
        // 最初のファイルだけ取得
        setZipFile(list.get(0).getPath());
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        dtde.dropComplete(b);
      }
    }
  }
 
}
 

コメント

タグ:

Java swing Zip JTable
最終更新:2013年02月07日 01:59