SQLの窓

2018年07月06日


WindowBuilder JFace : WEB より JSON を取得して Table に表示する

Okhttp(ダウンロード) を使用した HttpAccess クラス を使用して、WEB 上から JSON 文字列を取得して Table コントロールにデータの一覧を表示します。
(重要) Okio(ダウンロード) も必要です

JSON 文字列を オブジェクトに変換する為に、Google Gson(各バージョンダウンロードページ) を使用します

使用するのは fromJson メソッドのみです。
// ▼ オブジェクト化用クラス定義
// JSON のプロパティ名と 以下のフィールド名が一致します
private class MyData {
	String 社員コード;
	String 氏名;
	String フリガナ;
	String 所属;
	String 性別;
	String 作成日;
	String 更新日;
	String 給与;
	String 手当;
	String 管理者;
	String 生年月日;
}
--------------------------------------------------------
// ▼ 使用方法
// JSON 文字列 => オブジェクト用
Gson gson = new Gson();
 
// JSON では、{} が配列となっています
MyData[] array = gson.fromJson(s, MyData[].class);
--------------------------------------------------------
// ▼ データ( 一件分 )
[
    {
        "社員コード": "0001",
        "氏名": "山田 太郎",
        "フリガナ": "ウラオカ トモヤ",
        "所属": "0003",
        "性別": "0",
        "作成日": "2005-09-12 00:00:00",
        "更新日": "2005-11-28 00:00:00",
        "給与": "1002",
        "手当": "9000",
        "管理者": "0001",
        "生年月日": "2012\/03\/21"
    }
]
データを MyData のインスタンスとして取得した後、MyData のクラス定義より、java.lang.reflect.Field (getName メソッド) を使用してデータのタイトル用に MyData のフィールド名を取得します。さらに、get メソッドを使用してデータを取得して Table コントロールに反映させます。
// MyData のフィールドよりタイトルを作成
Field[] flds = MyData.class.getDeclaredFields();
int fldCount = 0;
for( Field fld : flds ) {
	// このクラス名 "Main" を排除
	if ( !fld.getType().getName().equals("Main") ) {
		// 列
		tableColumn = new TableColumn(table, SWT.NONE);
		// 表示幅
		tableColumn.setWidth(100);
		// タイトルとして、フィールド名
		tableColumn.setText(fld.getName());

		// 列数
		fldCount++;
	}
}
※ 1行目の getDeclaredFields メソッドは、java.lang.Class.getDeclaredFields

Table コントロールは、org.eclipse.swt.widgets.Table です。

▼ 列定義用
TableColumn
▼ 行データ用
TableItem
// 列数ぶん配列を作成
String[] columnData = new String[fldCount];
 
// データを一行ぶん作ったら...

// 行作成( Table と関係づけ )
tableItem = new TableItem(table, SWT.NONE);
// 列データを配列で一括設定( 配列で一括設定 )
tableItem.setText(columnData);

// public void setText(String[] strings)
// Sets the text for multiple columns in the table.
// Note: If control characters like '\n', '\t' etc. are used in the string, 
// then the behavior is platform dependent.
// 
// Parameters:
// strings - the array of new strings
※ メニューの作成は、『Pleiades Oxygen + WindowsBuilder で MySQL を使用して SQL(select) からデータの一覧を表示する』を参照して下さい。
import java.lang.reflect.Field;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
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.Point;
import org.eclipse.swt.graphics.Rectangle;
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.MessageBox;
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 Main extends ApplicationWindow {

	private Table table;
	private String url = "http://localhost/web/form/basic-php-0628-iframe-client/data.php";
	private HttpAccess httpAccess;

	// メニユーアイテム
	private Action action;

	private class MyData {
		String 社員コード;
		String 氏名;
		String フリガナ;
		String 所属;
		String 性別;
		String 作成日;
		String 更新日;
		String 給与;
		String 手当;
		String 管理者;
		String 生年月日;
	}

	// *******************************
	// コンストラクタ
	// *******************************
	public Main() {
		super(null);
		createActions();
		addMenuBar();
		httpAccess = new HttpAccess(url);
	}

	// *******************************
	// コントロール追加
	// *******************************
	@Override
	protected Control createContents(Composite parent) {
		Composite container = new Composite(parent, SWT.NONE);
		container.addControlListener(new ControlAdapter() {
			@Override
			public void controlResized(ControlEvent e) {

				Rectangle size = container.getClientArea();
				table.setSize(size.width-21, size.height-84);

			}
		});

		// *******************************
		// ボタン
		// *******************************
		Button btnNewButton = new Button(container, SWT.NONE);
		btnNewButton.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				table.removeAll();
				loadMySQL();
			}
		});
		btnNewButton.setBounds(10, 10, 75, 25);
		btnNewButton.setText("実行");

		// *******************************
		// テーブル
		// *******************************
		table = new Table(container, SWT.BORDER | SWT.FULL_SELECTION);
		table.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseDoubleClick(MouseEvent e) {

				int row_no = table.getSelectionIndex();
				// 行 は 0 以上
				if ( row_no >= 0 ) {

					// タイトル部分の表示
					TableColumn[] tableColumns = table.getColumns();
					for( TableColumn column: tableColumns ) {
						System.out.println( column.getText() );
					}

					// 行部分の表示
					TableItem tableItem = table.getItem(row_no);
					int columnCount = tableColumns.length;
					for( int i = 0; i < columnCount; i++ ) {
						System.out.println( tableItem.getText(i));
					}

				}
			}
		});
		table.setBounds(10, 41, 591, 333);
		table.setHeaderVisible(true);
		table.setLinesVisible(true);

		return container;
	}

	// *******************************
	// データ表示
	// *******************************
	protected void loadMySQL() {

		// 引数のインターフェイスが内部より呼ばれる
		httpAccess.sendGet(new HttpAccess.SendGetListener() {

			// インターフェイス内で定義したメソッド
			public void sendGetListener(String s) {
				
				if ( s.equals("{}")) { 
					MessageBox message = new MessageBox(Main.this.getShell(),SWT.OK);
					message.setMessage("データを取得できませんでした");
					message.open();
					return;
				}

				// JSON 文字列 => オブジェクト用
				Gson gson = new Gson();

				// JSON では、{} が配列となっています
				MyData[] array = gson.fromJson(s, MyData[].class);

				// 列定義用
				TableColumn tableColumn = null;

				// MyData のフィールドよりタイトルを作成
				Field[] flds = MyData.class.getDeclaredFields();
				int fldCount = 0;
				for( Field fld : flds ) {
					// このクラス名 "Main" を排除
					if ( !fld.getType().getName().equals("Main") ) {
						// 列
						tableColumn = new TableColumn(table, SWT.NONE);
						// 表示幅
						tableColumn.setWidth(100);
						// タイトルとして、フィールド名
						tableColumn.setText(fld.getName());

						// 列数
						fldCount++;
					}
				}

				// 行
				TableItem tableItem = null;

				// array に MyData の配列が格納されています
				for (MyData data: array) {

					// 列数ぶん配列を作成
					String[] columnData = new String[fldCount];

					// 配列参照用
					int idx = 0;
					// フィールド単位でデータを取得する
					for( Field fld : flds ) {
						// このクラス名 "Main" を排除
						if ( !fld.getType().getName().equals("Main") ) {
							try {
								if ( fld.get( data ) == null ) {
									// データが NULL の場合は空白
									columnData[idx] = "";
								}
								else {
									columnData[idx] = fld.get( data ).toString();
								}
							} catch (Exception e) {
								// エラーの場合は空白
								columnData[idx] = "";
							}
							idx++;

						}
					}

					// 行作成
					tableItem = new TableItem(table, SWT.NONE);
					// 列データを配列で一括設定
					tableItem.setText(columnData);

				}

			}

		});


	}

	// *******************************
	// メニューのアイテム
	// *******************************
	private void createActions() {
		// Create the actions
		{
			action = new Action("実行") {

				@Override
				public void run() {
					table.removeAll();
					loadMySQL();
				}

			};
		}
	}

	// *******************************
	// メニュー
	// *******************************
	@Override
	protected MenuManager createMenuManager() {
		MenuManager menuManager = new MenuManager("menu");

		MenuManager menuManager_item = new MenuManager("メニュー");
		menuManager.add(menuManager_item);
		menuManager_item.add(action);
		return menuManager;
	}

	// *******************************
	// エントリポイント
	// *******************************
	public static void main(String args[]) {
		try {
			Main window = new Main();
			window.setBlockOnOpen(true);
			window.open();
			Display.getCurrent().dispose();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// *******************************
	// Shell の初期処理
	// *******************************
	@Override
	protected void configureShell(Shell newShell) {
		super.configureShell(newShell);
		newShell.setText("タイトル");
	}

	// *******************************
	// 画面の初期処理
	// *******************************
	@Override
	protected Point getInitialSize() {
		return new Point(800, 600);
	}
}



HttpAccess クラス

SendGetListener インターフェイスを定義して、JSON 文字列を受信した後の処理を、呼び出し元で処理させるようにしています。=> ※ listner.sendGetListener(data); の部分
import java.io.IOException;

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

public class HttpAccess {

	private OkHttpClient okHttpClient;
	private String url;

	// 受信イベント
	public interface SendGetListener {
		abstract public void sendGetListener(String s);
	}

	// コンストラクタ
	public HttpAccess(String url) {

		this.okHttpClient = new OkHttpClient();
		this.url = url;

	}

	public HttpAccess() {
		this.okHttpClient = new OkHttpClient();
	}

	public void setUrl(String url) {
		this.url = url;
	}


	public void sendGet(SendGetListener listner) {

		// 汎用的に 初期値は {} としています
		String data = "{}";

		Request.Builder builder = new Request.Builder();
		builder.url(url);
		Request request = builder.build();

		Response response = null;
		try {
			response = HttpAccess.this.okHttpClient.newCall(request).execute();
			data = response.body().string();
		}
		catch (IOException e) {
			e.printStackTrace();
		}

		listner.sendGetListener(data);

	}

}


関連する記事

Pleiades Oxygen + WindowsBuilder で MySQL を使用して SQL(select) からデータの一覧を表示する






posted by lightbox at 2018-07-06 13:55 | java : WindowBuilder | このブログの読者になる | 更新情報をチェックする
container 終わり



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

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり