インターネットからデータを読み込むのに、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() の実行場所によっても固まったりしたので、変数の置き場所を実行ブロック内にしています。
|
【java : WindowBuilderの最新記事】
- WindowBuilder JFace : WEB より JSON を取得して Table に表示する
- Pleiades All in One で、Windows アプリを作成する手順( WindowBuilder + Swing デザイナー or SWT デザイナー[JFace] )
- WindowBuilder(Swing) で、WEBカメラを使用して画像を保存して okhttp で WEBサーバへアップロードする
- Java WindowBuilder から超簡易掲示板(CSVタイプ)投稿
- WindowBuilder テンプレートのテーブルコントロールに MySQL のデータを表示する
- Eclipse 4.4 Pleiades + WindowBuilder テンプレート / アプリケーションウインドウとダイアログ / インポート手順