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) からデータの一覧を表示する
|
【java : WindowBuilderの最新記事】
- Pleiades All in One で、Windows アプリを作成する手順( WindowBuilder + Swing デザイナー or SWT デザイナー[JFace] )
- WindowBuilder(Swing) で、WEBカメラを使用して画像を保存して okhttp で WEBサーバへアップロードする
- Java WindowBuilder から超簡易掲示板(CSVタイプ)投稿
- WindowBuilder のテーブルコントロールにインターネットから JSON データを読み込んで処理するテンプレート
- WindowBuilder テンプレートのテーブルコントロールに MySQL のデータを表示する
- Eclipse 4.4 Pleiades + WindowBuilder テンプレート / アプリケーションウインドウとダイアログ / インポート手順