SQLの窓

2017年06月03日


Swing の JTable に 1) ローカルの CSV。2) WEB の CSV を取り込んで表示する



環境準備

Eclipse は Pleiades の Neon です。Swing を使用する為の WindowBuilder のインストールとプロジェクト作成は、▼ 以下のリンク先を参照して下さい。

Pleiades All in One(NEON) で、Windows アプリを作成する手順( WindowBuilder + Swing デザイナー or SWT デザイナー[JFace] )

WEB へのアクセスは okhttp を使用します。ライブラリは MAVEN で取り込みます。okhttp は okio に依存しますが、リポジトリのファイルが壊れている場合は、okio の dependency も記述して、旧バージョンを順に試すといいでしょう。

pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>WinApp</groupId>
  <artifactId>WinApp</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <dependencies>
    <dependency>
      <groupId>com.squareup.okhttp3</groupId>
      <artifactId>okhttp</artifactId>
      <version>3.8.0</version>
    </dependency>    
  </dependencies>
  
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

MAVEN プロジェクトへの変更は、プロジェクトを右クリックして『構成』から、選択できます

JTable は表示のみ対応した、JTableUnit と言うクラスを作成して使用しています。

JTableUnit
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class JTableUnit extends JTable {
	
	private JScrollPane _scrollPane;

	public JTableUnit( ) {
		super();
		_scrollPane = new JScrollPane(this);
	}
	
	@Override
	public boolean isCellEditable(int row, int column) {
		return false;
	}	
	
	public JScrollPane getScrollPane() {
		return _scrollPane; 
	}

	// ********************
	// 初期化
	// ********************
	public void reset() {

		DefaultTableModel dtm = (DefaultTableModel) this.getModel();
		dtm.setRowCount(0);
		
		int cols = this.getColumnCount();

		for( int i = cols-1; i >= 0; i-- ) {
			this.removeColumn((this.getColumnModel()).getColumn(i));
		}
		
		// データモデルも初期化
		dtm.setColumnCount(0);

	}
	// ********************
	// 行を全て削除
	// ********************
	public void clear(){
		DefaultTableModel dtm = (DefaultTableModel) this.getModel();
		dtm.setRowCount(0);
	}
	public void addColumn(String name) {
		DefaultTableModel dtm = (DefaultTableModel) this.getModel();
		dtm.addColumn(name);
	}
	public void setColumnTitle(String name,String title) {
		TableColumn tc = this.getColumn(name);
		 tc.setHeaderValue(title);
		 tc.setIdentifier(name);
	}
	public void addRow() {
		DefaultTableModel dtm = (DefaultTableModel) this.getModel();
		Object[] obj  = null;
		dtm.addRow(obj);
	}
	public void setColumn(int row, int col, String data) {
		this.setValueAt( data, row,  col );
	}
}


前提条件

CSV は、ローカル・WEB 共に shift_jis です。
WEB 上のデータは https://lightbox.sakura.ne.jp/demo/json/syain_csv.php です。

処理

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class Main extends JFrame {

	private JPanel contentPane;
	private JTableUnit table;
	private JPanel panel;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main frame = new Main();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public Main() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 1000, 700);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		JButton buttonLocal = new JButton("ローカルCSV読込み");
		buttonLocal.setBounds(10, 10, 150, 21);
		buttonLocal.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				loadCsv();

			}
		});
		contentPane.add(buttonLocal);

		JButton buttonWeb = new JButton("WEBCSV読込み");
		buttonWeb.setBounds(172, 10, 150, 21);
		buttonWeb.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				loadWebCsv();

			}
		});
		contentPane.add(buttonWeb);

		JButton buttonClear = new JButton("行クリア");
		buttonClear.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				table.clear();
			}
		});
		buttonClear.setBounds(334, 10, 150, 21);
		contentPane.add(buttonClear);

		panel = new JPanel();
		panel.setBounds(12, 52, 960, 600);
		panel.setLayout(new BorderLayout(0, 0));
		contentPane.add(panel);

		table = new JTableUnit();
		panel.add(table.getScrollPane());



	}

	// *************************
	// ローカルCSV読込み
	// *************************
	private void loadCsv(){

		table.reset();

		try {
			FileInputStream fis = new FileInputStream("C:\\Users\\lightbox\\Documents\\社員.csv");
			InputStreamReader isr = new InputStreamReader(fis, "MS932");
			BufferedReader br = new BufferedReader(isr);

			String cols_string;
			String[] col_data = null;
			int line_count = 0;
			while ( null != (cols_string = br.readLine() ) ) {

				// 空行を無視する
				if (cols_string.equals("")) {
					continue;
				}

				// 初回( タイトル部分 )
				if ( col_data == null ) {
					col_data = cols_string.split(",");

					// addColumn と  setColumnTitle は別々に実行する必要があります
					for( int i = 0; i < col_data.length; i++ ) {
						// カラムの ID を定義しています
						table.addColumn(String.format("col%d", i) );
					}
					for( int i = 0; i < col_data.length; i++ ) {
						// カラムの ID に対してタイトル文字列をセットしています
						table.setColumnTitle(String.format("col%d", i), col_data[i] );
					}
					continue;
				}

				// 2回目以降( データ部分 )
				col_data = cols_string.split(",");

				// 空行の追加
				table.addRow();
				for( int i = 0; i < col_data.length; i++ ) {
					// 行, カラム でデータをセット
					table.setColumn(line_count, i, col_data[i] );
				}
				line_count++;
			}

			br.close();
			isr.close();
			fis.close();
		}
		catch (Exception e) {
			e.printStackTrace();
		}

	}

	// *************************
	// WEBCSV読込み
	// *************************
	private void loadWebCsv(){

		table.reset();

		String url = "https://lightbox.sakura.ne.jp/demo/json/syain_csv.php";
		String result ="[\"error\"]";
		OkHttpClient client = new OkHttpClient();
		Request.Builder builder = new Request.Builder();
		builder.url(url);
		Request request = builder.build();

		Response response = null;
		try {
			response = client.newCall(request).execute();
			result = response.body().string();
		}
		catch (IOException e) {
			e.printStackTrace();
		}

		String[] row_data = result.split("\n");
		String[] col_data = null;
		int line_count = 0;
		for( String cols_string : row_data ) {

			// 空行を無視する
			if (cols_string.equals("")) {
				continue;
			}

			// 初回( タイトル部分 )
			if ( col_data == null ) {
				col_data = cols_string.split(",");
				for( int i = 0; i < col_data.length; i++ ) {
					// カラムの ID を定義しています
					table.addColumn(String.format("col%d", i) );
				}
				for( int i = 0; i < col_data.length; i++ ) {
					// カラムの ID に対してタイトル文字列をセットしています
					table.setColumnTitle(String.format("col%d", i), col_data[i] );
				}
				continue;
			}

			// 2回目以降( データ部分 )
			col_data = cols_string.split(",");

			// 空行の追加
			table.addRow();
			col_data = cols_string.split(",");
			for( int i = 0; i < col_data.length; i++ ) {
				// 行, カラム でデータをセット
				table.setColumn(line_count, i, col_data[i] );
			}
			line_count++;

		}
	}

}

画面にデザイナで Panel を作成しておいて、JScrollPane 込みで作成されている JTableUnit を Panel に組み込んでいます(82、83 行)。

okhttp での キャラクタセットは、サーバ側から送られた Content-Type を元に response.body().string() 実行時に自動変換されます。



タグ:swing java OkHttp
posted by lightbox at 2017-06-03 17:48 | Comment(0) | java : Swing | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり