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) からデータの一覧を表示する