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);
}
}
}
}
コメント
最終更新:2013年02月07日 01:59