SQLの窓

2016年05月22日


WindowBuilder のテーブルコントロールにインターネットから JSON データを読み込んで処理するテンプレート





インターネットからデータを読み込むのに、HttpGet というクラスをソースで同梱しています。プロジェクトのインポート方法は、『Eclipse 4.4 Pleiades + WindowBuilder テンプレート / アプリケーションウインドウとダイアログ』を参照して下さい。

JSON データを扱う Google Gson は、ライブラリとしては同梱しています。ダウンロードはこちら(GitHub のページ)です。※ ページ内の Gson Download のリンクからダウンロードページへ移動します

処理概要

1) ボタンをクリックすると、お天気Webサービス仕様 - Weather Hacks - livedoor 天気情報 の 『大阪の』JSON データを取得します。

2) 場所の名前と、地域コードを二つの列に表示し、行の内部コードとして URL を格納します

3) 行をダブルクリックすると、URL を使用してブラウザで開きます

ソースコード
import java.awt.Desktop;
import java.net.URI;

import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

import com.google.gson.Gson;


public class TopWindow extends ApplicationWindow {

	private int width = 800;
	private int height = 600;
	private Table table;
	private Gson gson;

	// *********************************
	// コンストラクタ
	// *********************************
	public TopWindow() {
		super(null);
	}

	// *********************************
	// コントロールの追加
	// ※ Design での変更が反映されます
	// *********************************
	@Override
	protected Control createContents(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);

		// ボタンの定義
		Button button = new Button(container, SWT.NONE);
		// ボタンのイベント
		button.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				
				// プログラム開始時に実行すると、固まるので直前に
				try {
					UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
				} catch (ClassNotFoundException | InstantiationException
						| IllegalAccessException
						| UnsupportedLookAndFeelException e1) {
					e1.printStackTrace();
				}
				
				// 確認ダイアログ( OK_CANCEL )の表示
				int result = JOptionPane.showConfirmDialog(
						null,
						"データを取得しますか",
						"確認",
						JOptionPane.OK_CANCEL_OPTION,
						JOptionPane.QUESTION_MESSAGE);
				// OK を選択
				if ( result == JOptionPane.OK_OPTION ) {
					// インターネットアクセス
					String data = HttpGet.execute("http://weather.livedoor.com/forecast/webservice/json/v1?city=270000", "utf-8");
					// データを取得できた
					if ( !data.equals("") ) {
						// コンソールで確認
						System.out.println(data);
						// JSON をオブジェクト化する為の GSON を作成
						gson = new Gson();
						// データに適合するプライベートクラスで変換
						Weather weatherData = gson.fromJson(data, Weather.class);
						// データ行数
						int length = weatherData.pinpointLocations.length;

						// 行データ格納用
						TableItem tableItem;
						// 列データ格納用
						String[] columnData = new String[2];
						for( int i = 0; i < length; i++) {
							// 確認用の表示
							System.out.println(String.format("name:%s, link:%s",
									weatherData.pinpointLocations[i].name,
									weatherData.pinpointLocations[i].link
								)
							);
							// 場所名
							columnData[0] = weatherData.pinpointLocations[i].name;
							// livedoor の個別コード
							columnData[1] = weatherData.pinpointLocations[i].link.replace("http://weather.livedoor.com/area/forecast/", "");
							// 行を Table から新しく取得
							tableItem = new TableItem(table, SWT.NONE);
							// 行に表示用の配列データをセット
							tableItem.setText(columnData);
							// livedoor の個別天気表示 URL を内部データとしてセット
							tableItem.setData(weatherData.pinpointLocations[i].link);
							
						}
					}
				}
			}
		});
		button.setBounds(10, 10, 81, 28);
		button.setText("実行");

		// Table の定義
		table = new Table(container, SWT.BORDER | SWT.FULL_SELECTION);
		table.addMouseListener(new MouseAdapter() {
			
			// テーブルをダブルクリック
			@Override
			public void mouseDoubleClick(MouseEvent e) {
				int row_no = table.getSelectionIndex();
				// 行が内ばあいは row_no は -1
				System.out.println( String.format("row_no : %d",row_no) );
				// 行データがあり、任意の行の上でダブルクリックした場合
				if ( row_no >= 0 ) {
					// タイトル部分の表示
					TableColumn tableColumn;
					tableColumn = table.getColumn(0);
					System.out.println( tableColumn.getText() );
					tableColumn = table.getColumn(1);
					System.out.println( tableColumn.getText() );

					// 行部分の表示
					TableItem tableItem = table.getItem(row_no);
					// 名前の表示
					System.out.println( tableItem.getText(0) );
					// コードの表示
					System.out.println( tableItem.getText(1) );
					// URL の表示
					System.out.println( tableItem.getData() );
					
					// プログラム開始時に取得すると、固まるので直前に
					// ブラウザを開く
					Desktop desktop = Desktop.getDesktop();
					try {
						URI uri = new URI((String) tableItem.getData());
						desktop.browse(uri);
					} catch (Exception ex) {
						ex.printStackTrace();
					}				
					
				}
			}
		});
		table.setBounds(10, 50, 764, 498);
		table.setHeaderVisible(true);
		table.setLinesVisible(true);
		
		// 列の作成
		TableColumn tableColumn = new TableColumn(table, SWT.NONE);
		tableColumn.setWidth(100);
		tableColumn.setText("名前");

		TableColumn tableColumn_1 = new TableColumn(table, SWT.NONE);
		tableColumn_1.setWidth(131);
		tableColumn_1.setText("コード");


		return container;
	}

	// *********************************
	// アプリケーションの開始
	// *********************************
	public static void main(String args[]) {
		try {
			// 自分自身(TopWindow) の作成
			TopWindow window = new TopWindow();
			// open を実行したら、Window を閉じるまで次の行を実行しない
			window.setBlockOnOpen(true);
			window.open();
			// Window を閉じたら以下を実行してアプリケーションを終了する
			Display.getCurrent().dispose();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// *********************************
	// Window の初期設定
	// *********************************
	@Override
	protected void configureShell(Shell newShell) {
		super.configureShell(newShell);

		// タイトルの設定
		newShell.setText("タイトル文字列");

		// アイコンの設定
		ImageData id = new ImageData("image/lightbox.png");
		Image img = new Image(newShell.getDisplay(), id);
		newShell.setImage(img);

	}

	// *********************************
	// Window サイズの初期設定
	// *********************************
	@Override
	protected Point getInitialSize() {
		// プライベート変数を使用してウインドウサイズを決定しています
		return new Point(width, height);
	}
	
	// Livedoor の お天気Webサービス用 (配列データ用)
	private class PinpointLocation {
		String link;
		String name;
		public PinpointLocation(String myLink, String myName) {
			name = myName;
			link = myLink;
		}

		@Override
		public String toString() {
			return name;
		}
	}
	// Livedoor の お天気Webサービス用 (JSON用)
	private class Weather {
		PinpointLocation[] pinpointLocations;
	}	
}

どのような環境でも発生するのかどうかわかりませんが、UIManager.setLookAndFeel の実行場所によって、JOptionPane のメッセージボックスで固まったり、Desktop.getDesktop() の実行場所によっても固まったりしたので、変数の置き場所を実行ブロック内にしています。



posted by lightbox at 2016-05-22 19:10 | Comment(0) | java : WindowBuilder | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

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

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