「*[JavaFX]」の検索結果を表示しています
2015-01-25 08:48

JavaFX connecting AWS S3 bucket simple sample

I just joined this workshop Java workshop for only women
and AWS workshop for only women last week.
It was very fun to take part in this kind of events.

At first we introduced ourselves and mentioned own today's task.
Then having fun time with teaching each other.
At last we announced today's result of each person.

My goal is implementing JavaFX sample, which connecting AWS S3. Then to show S3's buckets in JavaFX.

f:id:tomoTaka:20150125082851p:image:w680
f:id:tomoTaka:20150125082919p:image:w680

Showing the S3 bucket on JavaFX.
f:id:tomoTaka:20150125083014p:image:w330

Connecting to AWS

        AmazonS3 s3 = new AmazonS3Client();
        Region usWest2 = Region.getRegion(Regions.US_WEST_2);
        s3.setRegion(usWest2);

Getting S3 bucket, and creating Tab.

        s3.listBuckets().forEach(bucket -> {
            // creating tab for each bucket
            Tab tab = new Tab();
            String bucketNm = bucket.getName();
            tab.setText(bucketNm);
            tabPane.getTabs().add(tab);
            VBox vbox = new VBox(10);
            vbox.setPadding(new Insets(10));
            vbox.setStyle("-fx-background-color: #ffc9ae");
            // Owner
            HBox hbox1 = new HBox(10);
            Label ownerLabel = new Label("Owner:");
            String owner = bucket.getOwner().getDisplayName();
            Text ownerText = new Text(owner);
            hbox1.getChildren().addAll(ownerLabel, ownerText);
            // Create Date
            HBox hbox2 = new HBox(10);
            Label dateLabel = new Label("Create Date:");
            String createDate = bucket.getCreationDate().toString();
            Text dateText = new Text(createDate);
            hbox2.getChildren().addAll(dateLabel, dateText);
            tab.setContent(vbox);
            tab.setStyle("-fx-background-color: #ffc9ae;");
            // ListView for file path
            ObservableList<String> items = FXCollections.observableArrayList("file path");
            ListView view = new ListView(items);
            ObjectListing objList = s3.listObjects(new ListObjectsRequest()
                    .withBucketName(bucketNm)
                    .withPrefix(""))
                    ;
            objList.getObjectSummaries().forEach(obj -> {
                String filePath = obj.getKey();
                items.add(filePath);
            });
            vbox.getChildren().addAll(hbox1, hbox2, view);
        });

Whole code is here tomoTaka01/JavaFXAWSS3Sample ? GitHub

I would like to express my gratitude to staff as well as Osakan Space.
Osakan Space
just keep coding... ;-)

Java女子部勉強会に行ってきました。

1/24(土) 関西Java女子部 部活 - connpassに参加してきました。
同じ週の水曜にははじめて女子応援企画!クラウド勉強会【女子限定】 - JAWS-UG KANSAI | Doorkeeperにも参加。
関西で女子会に2回も参加できてすごく楽しかったです。

最初に自己紹介と今日の課題を各自発表、その後自習ヽ時にスイーツタイム、最後に各自が課題を発表と、あっというまに時間が経過しました!私は最近いろいろはまっているgoogle maps APIなどいろいろ教えていただいてすごく勉強なりました。
(本を読んで静かに勉強していたほかの参加者さん、うるさくしてごめんなさい、^^;)

私の課題は、AWSのS3にJavaを使ってアクセスしてその内容(Bucket)をJavaFXを使って画面に表示することに挑戦してみました。
AWS勉強会でS3を触ってみた20150121 JAWS-UG関西女子会 第一回勉強会資料 // Speaker Deckを発表されていた(すごく楽しい発表でした)のですが、以前Javaからs3にアクセスするサンプルを実装(コピペ)してみたことを思い出したので、とりあえず勉強会では、bucketを検索して、bucketごとにJavaFXのTabを作成、各bucketのOwnerと作成日を表示するところまでで終わりました。
翌日にファイルをListViewを使って表示する機能を追加しました。
もっといろいろ(例えばファイルのアップロードとか)挑戦していきたいです!

f:id:tomoTaka:20150125082851p:image:w680
f:id:tomoTaka:20150125082919p:image:w680

上のAWSコンソールと同じbucketとファイルが表示されました。
f:id:tomoTaka:20150125083014p:image:w330

AWSのS3に接続

        AmazonS3 s3 = new AmazonS3Client();
        Region usWest2 = Region.getRegion(Regions.US_WEST_2);
        s3.setRegion(usWest2);

S3でのbucketを取得して、bucuket毎にタブを作成
作成したタブに「Owner」「作成日」とファイル一覧を表示

        s3.listBuckets().forEach(bucket -> {
            // creating tab for each bucket
            Tab tab = new Tab();
            String bucketNm = bucket.getName();
            tab.setText(bucketNm);
            tabPane.getTabs().add(tab);
            VBox vbox = new VBox(10);
            vbox.setPadding(new Insets(10));
            vbox.setStyle("-fx-background-color: #ffc9ae");
            // Owner
            HBox hbox1 = new HBox(10);
            Label ownerLabel = new Label("Owner:");
            String owner = bucket.getOwner().getDisplayName();
            Text ownerText = new Text(owner);
            hbox1.getChildren().addAll(ownerLabel, ownerText);
            // Create Date
            HBox hbox2 = new HBox(10);
            Label dateLabel = new Label("Create Date:");
            String createDate = bucket.getCreationDate().toString();
            Text dateText = new Text(createDate);
            hbox2.getChildren().addAll(dateLabel, dateText);
            tab.setContent(vbox);
            tab.setStyle("-fx-background-color: #ffc9ae;");
            // ListView for file path
            ObservableList<String> items = FXCollections.observableArrayList("file path");
            ListView view = new ListView(items);
            ObjectListing objList = s3.listObjects(new ListObjectsRequest()
                    .withBucketName(bucketNm)
                    .withPrefix(""))
                    ;
            objList.getObjectSummaries().forEach(obj -> {
                String filePath = obj.getKey();
                items.add(filePath);
            });
            vbox.getChildren().addAll(hbox1, hbox2, view);
        });

とりあえずコードはtomoTaka01/JavaFXAWSS3Sample ? GitHubにアップしました。

Java女子会AWS女子会のスタッフの方々には、お世話になりありがとうございました!
Java女子会ではいつも会場を提供していただいている、Osakan space大阪のコワーキングスペース : Osakan Space (オオサカンスペース) : 本町駅すぐ御堂筋沿い | 御堂筋線本町駅番出口から30秒のCoworking space(コワーキングスペース)です。さんにも感謝です!

2015-01-12 15:53

JavaFX Task sample using Java8 CompletableFuture

After reading Java8 Concurrency articleJava技術最前線 - 詳解 Java SE 8 第19回 Concurrency Utilitiesのアップデート その1:ITpro by @,
I wanted to try how to use JavaFX Task with CompletableFuture.
f:id:tomoTaka:20150112094833p:image:w380
This is very easy thanks to this website. 1 Concurrency in JavaFX (Release 8)

This code shows you how to control these tasks.

public class FXMLDocumentController implements Initializable {
    @FXML
    private ProgressBar progressbarA;
    @FXML
    private ProgressBar progressbarB;
    @FXML
    private ProgressBar progressbarC;    
    @FXML
    private void startTask(ActionEvent event){
        TaskSample taskA = new TaskSample();
        this.progressbarA.progressProperty().bind(taskA.progressProperty());
        TaskSample taskB = new TaskSample();
        this.progressbarB.progressProperty().bind(taskB.progressProperty());
        TaskSample taskC = new TaskSample();
        this.progressbarC.setProgress(0);
        taskC.setOnRunning(e -> {
            this.progressbarC.progressProperty().bind(taskC.progressProperty());
        });
        // just use CompletableFuture for executing tasks
        CompletableFuture<Void> futureA = CompletableFuture.runAsync(taskA);
        CompletableFuture<Void> futureB = CompletableFuture.runAsync(taskB);
        futureA.runAfterBoth(futureB, taskC);
    }
}

You just need to extend javafx.concurrent.Task for your own tasks.

public class TaskSample extends Task<Void>{
    @Override
    protected Void call() throws Exception {
        updateProgress(0, 10);
        IntStream.rangeClosed(1, 10).forEach(i -> {
            try {
                TimeUnit.SECONDS.sleep(1); // to do something
            } catch (InterruptedException ex) {
                Logger.getLogger(TaskSample.class.getName()).log(Level.SEVERE, null, ex);
            }
            updateProgress(i, 10);
        });
        return null;
    }
}

The whole code is heretomoTaka01/ConcurrencyTaskSample ? GitHub
keep coding... ;-)

2014-12-31 10:51

JavaFX with google map and JSON sample

Thanks to this web site Adding HTML Content to JavaFX Applications | JavaFX 2 Tutorials and Documentation, it it easy making upcalls from JavaScript to JavaFX.
1.Adding lines to HTML's table and creating Marker on this map, by clicking on the map.
2.Saving point's information as json file.(Javascript calls JavaFX method)
3.Drawing Polyline and adding lines to HTML's table by reading json file.(JavaFX calls JavaScript method)

(The color picker on the WebView does not work? Why does Marker have black background color?)
f:id:tomoTaka:20141231101359p:image:w380

f:id:tomoTaka:20141231101418p:image:w380

f:id:tomoTaka:20141231101433p:image:w380

f:id:tomoTaka:20141231101447p:image:w380

JavaScript calls JavaFX getInfoList method(save to json button event)

        WebView webView = new WebView();
        WebEngine engine = webView.getEngine();
        URL url = getClass().getResource("sample.html");
        engine.load(url.toExternalForm());
        JSObject win = (JSObject) engine.executeScript("window");
        win.setMember("app", new JavaApp(stage)); // *** for javascript 
...
    public class JavaApp {
        private Stage stage;
        public JavaApp(Stage stage) {
            this.stage = stage;
        }
        /**
         * called from JavaScript by clicking [save to Json] button
         * @param infos 
         */
        public void getInfoList(String infos) {
            FileChooser fileChooser = new FileChooser();
            File file = fileChooser.showSaveDialog(this.stage);
            try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
                writer.write(infos);
            } catch (IOException ex) {
                Logger.getLogger(MapPositionSample.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
function saveJson(){
    // remove deleted info
    var newList = [];
    pointsInfo.infoList.forEach(function(info){
        if (!info.isDeleted){
            delete info.latlng;
            newList.push(info);
        }
    });
    // call java method
    var infos = JSON.stringify(newList);
    app.getInfoList(infos); // *** call Java method
}

JavaFX calls JavaScript drawPolylineFromJson method(load json to map button event)

        loadBtn.setOnAction(e -> {
            FileChooser fileChooser = new FileChooser();
            File file = fileChooser.showOpenDialog(stage);
            try (BufferedReader reader = new BufferedReader(new FileReader(file))){
                // file to json
                Object obj = JSONValue.parse(reader);
                // call JacaScript method with JSON object
                engine.executeScript("drawPolylineFromJson(" + obj + ")"); // *** call java script
            } catch (Exception ex) {
                Logger.getLogger(MapPositionSample.class.getName()).log(Level.SEVERE, null, ex);
            }
        });
function drawPolylineFromJson(pointsListJson){
    // clear map & table
    pointsInfo.pointNo = -1; // reset no
    pointsInfo.deleteAllMarkers(); // remove all markers from map
    initPolyLine.setMap(null); // remove KIX - SFO Polyline
    var tbody = $('#points');
    tbody.children().remove();
    var kixLatLng = infos[0];
    var sfoLatLng = infos[1];
    var prevPath = new google.maps.LatLng(kixLatLng.lat, kixLatLng.lng);
    pointsListJson.forEach(function(info){
        pointsInfo.addPoint(info);
        // add point to table 
        addTr(pointsInfo.getPoint());
        // create polyline
        var thisPath = new google.maps.LatLng(info.lat, info.lng);
        var polylineOpt = {
           map: map,
           path: [prevPath, thisPath],
           strokeColor: info.color
       };
       new google.maps.Polyline(polylineOpt);    
       prevPath = thisPath;
    });
    // last place - SFO
    var sfoPath = new google.maps.LatLng(sfoLatLng.lat, sfoLatLng.lng);
    var polylineOpt = {
       map: map,
       path: [prevPath, sfoPath],
       strokeColor: '#000000'
    };
    new google.maps.Polyline(polylineOpt);    
}

This is very hard for me to explain how to implement this kind of code...^^;;
The Whole code is here.tomoTaka01/MapPositonSample ? GitHub
keep coding...

JavaFX with google map and JSON sample

1.google map上でクリックしたポイントを元に、HTMLのTableに行を追加とmap上にマーカーを表示。
2.上記1の情報をJavaScriptからJavaFXのメソッドをcallしてJson形式のファイルとして保存。
3.JavaFXで上記2のjsonファイルを読み込んで、JavaScriptのメソッドをcallしてHTMLのTableに行を追加とmap上にPolylineを描画。

JavaFXでWebViewを使った時にマーカの背景が黒になる?color pickerは使えない?)
f:id:tomoTaka:20141231101359p:image:w380

f:id:tomoTaka:20141231101418p:image:w380

f:id:tomoTaka:20141231101433p:image:w380

f:id:tomoTaka:20141231101447p:image:w380

JavaScriptからJavaFXのメソッドをcall(save to json ボタン処理)

        WebView webView = new WebView();
        WebEngine engine = webView.getEngine();
        URL url = getClass().getResource("sample.html");
        engine.load(url.toExternalForm());
        JSObject win = (JSObject) engine.executeScript("window");
        win.setMember("app", new JavaApp(stage)); // *** for javascript 
...
    public class JavaApp {
        private Stage stage;
        public JavaApp(Stage stage) {
            this.stage = stage;
        }
        /**
         * called from JavaScript by clicking [save to Json] button
         * @param infos 
         */
        public void getInfoList(String infos) {
            FileChooser fileChooser = new FileChooser();
            File file = fileChooser.showSaveDialog(this.stage);
            try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
                writer.write(infos);
            } catch (IOException ex) {
                Logger.getLogger(MapPositionSample.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
function saveJson(){
    // remove deleted info
    var newList = [];
    pointsInfo.infoList.forEach(function(info){
        if (!info.isDeleted){
            delete info.latlng;
            newList.push(info);
        }
    });
    // call java method
    var infos = JSON.stringify(newList);
    app.getInfoList(infos); // *** call Java method
}

JavaFX からJavaScriptのメソッドをcall(load json to map ボタン処理)

        loadBtn.setOnAction(e -> {
            FileChooser fileChooser = new FileChooser();
            File file = fileChooser.showOpenDialog(stage);
            try (BufferedReader reader = new BufferedReader(new FileReader(file))){
                // file to json
                Object obj = JSONValue.parse(reader);
                // call JacaScript method with JSON object
                engine.executeScript("drawPolylineFromJson(" + obj + ")"); // *** call java script
            } catch (Exception ex) {
                Logger.getLogger(MapPositionSample.class.getName()).log(Level.SEVERE, null, ex);
            }
        });
function drawPolylineFromJson(pointsListJson){
    // clear map & table
    pointsInfo.pointNo = -1; // reset no
    pointsInfo.deleteAllMarkers(); // remove all markers from map
    initPolyLine.setMap(null); // remove KIX - SFO Polyline
    var tbody = $('#points');
    tbody.children().remove();
    var kixLatLng = infos[0];
    var sfoLatLng = infos[1];
    var prevPath = new google.maps.LatLng(kixLatLng.lat, kixLatLng.lng);
    pointsListJson.forEach(function(info){
        pointsInfo.addPoint(info);
        // add point to table 
        addTr(pointsInfo.getPoint());
        // create polyline
        var thisPath = new google.maps.LatLng(info.lat, info.lng);
        var polylineOpt = {
           map: map,
           path: [prevPath, thisPath],
           strokeColor: info.color
       };
       new google.maps.Polyline(polylineOpt);    
       prevPath = thisPath;
    });
    // last place - SFO
    var sfoPath = new google.maps.LatLng(sfoLatLng.lat, sfoLatLng.lng);
    var polylineOpt = {
       map: map,
       path: [prevPath, sfoPath],
       strokeColor: '#000000'
    };
    new google.maps.Polyline(polylineOpt);    
}

とりあえずメモとしてアップtomoTaka01/MapPositonSample ? GitHub
全然説明が書けてない、、、

2014-12-21 08:34

JavaFX with Google map sample

JavaFX Advent Calendar 2014 - Adventarの21日目です。
昨日は@さんのOpenDolphinでEnterprise JavaFX - Challenge Java EE !でした。

ちょっと、業務でGoogle mapを使っているので、JavaFXからWebViewでGoogle mapを操作してみました。
操作と言ってもJavaFXからmapのズームをセット、mapのズームが変わった時にJavaFXのSliderにそのズームサイズを表示するだけです。
すごく簡単です!
f:id:tomoTaka:20141221080559p:image:w480

set zoom ボタンをクリックしてmapのズームをセット

1. MapZoomSample.java

button.setOnAction(e -> {
    String zoom = zoomText.getText();
    engine.executeScript("changeZoom(" + zoom + ")"); 
});

2.sample.html内のJavaScript

function changeZoom(zoom) {
    // spinnerが公開されたら変更する予定
    map.setZoom(zoom);
}
mapのズームがかわった時に、JavaFXのSliderをセット

1.sample.html内のJavaScript

google.maps.event.addListener(map, 'zoom_changed', function () {
    var zoom = map.getZoom();
    app.setZoom(zoom);
});

2. MapZoomSample.java

public class JavaApp{
    // set the slider
    public void setZoom(int zoom){
        slider.setValue(zoom);
    }
}
...
WebView webView = new WebView();
WebEngine engine = webView.getEngine();
String html = getClass().getResource("sample.html").toExternalForm();
// 以下の2行でJavaScriptからJavaをupcallできるようになります
JSObject win = (JSObject) engine.executeScript("window");
win.setMember("app", new JavaApp());

とりあえずコードは、tomoTaka01/MapZoomSample ? GitHubにアップしました。
詳しくは、 Adding HTML Content to JavaFX Applications | JavaFX 2 Tutorials and Documentationにあります。
もっといろいろ試したいことがあるのですが、、、全然勉強不足で(汗)

2014-10-12 09:28

Try to build OpenJFX

Since I take this OpenJFX for Embedded Devices [CON3307] session at JavaOne2014, I wanted to try to build OpenJFX. The session was about Building the OpenJFX embedded stack for Linux desktop,but I use Mac at first.
Building the OpenJFX embedded stack for Linux desktop - OpenJFX - OpenJDK Wiki
Thanks to this article, it is not difficult to build openjfx.Building OpenJFX - OpenJFX - OpenJDK Wiki

Environments

Prerequisites

f:id:tomoTaka:20141011114156p:image

f:id:tomoTaka:20141011114606p:image
I installed Gradle by using GVM before, but it's version is 1.12.But because Gradle 1.8 is required, I installed Gradle 1.8.(F.Y.R seeGVM by gvmtool)

gvm install gradle 1.8

I did not know about QT at that time, then downloaded the latest version 5.3.Qt Project
f:id:tomoTaka:20141012073354p:image
After trying qmake command, the below error occurred.
f:id:tomoTaka:20141012075030p:image
Amending the first line of qdevice.pri file(macosx10.8 ->macosx10.9) to resolve this error.
f:id:tomoTaka:20141012075539p:image

Building OpenJFX

f:id:tomoTaka:20141012080125p:image

Making the openjfx folder, because I wanted to clone the source file in the openjfx folder.

mkdir openjfx
cd openjfx
hg clone http://hg.openjdk.java.net/openjfx/8u-dev/rt
cd rt
gralde tasks

It is takes time to execute tasks command for the first time.
f:id:tomoTaka:20141012082726p:image
f:id:tomoTaka:20141012082743p:image

gradle clean
gradle projects

f:id:tomoTaka:20141012083131p:image

gradle --profile

The error occurred.
f:id:tomoTaka:20141012085326p:image
Thanks to the article, the profile command worked.
Building OpenJFX on Mac OS X 10.9.2 / XCode 5.1 / XCode 4.3.3

sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk

To check the html file under build/reports/profile directory.
f:id:tomoTaka:20141012085851p:image:w360

gradle

The build succeeded!

gradle base:test

The test succeeded.
To check the html file under modules/base/build/reports/tests directory.
f:id:tomoTaka:20141012091631p:image:w360
Anyway I am sooooooo happy to see how to build openJFX! ;-)

OpenJFXのビルドを試してみる

JavaOne2014で、OpenJFX for Embedded Devices [CON3307]のセッションを受けてちょっとOpenJFXのビルドを試してみました。2014-10-02 - tomoTakaの日記
セッションでは、embedded に関するお話だったのですが、とりあえずMacで挑戦してみました。Building the OpenJFX embedded stack for Linux desktop - OpenJFX - OpenJDK Wiki
基本的にすべてBuilding OpenJFX - OpenJFX - OpenJDK Wikiに書いています。

環境の確認(準備)

f:id:tomoTaka:20141011114156p:image

f:id:tomoTaka:20141011114606p:image
Gradleは以前にGVMを使ってインストール2014-05-02 - tomoTakaの日記してVersionが1.12だったので1.8を再度インストールしました。GVMはGVM by gvmtoolを参照。

gvm install gradle 1.8

QTQt Projectはいままで知らなかったです。とりあえず最新の5.3をdownload
f:id:tomoTaka:20141012073354p:image
ちょっと試してみると以下のエラーが発生
f:id:tomoTaka:20141012075030p:image
以下のファイルのバージョンが1.8になっていたので1.9に修正。
f:id:tomoTaka:20141012075539p:image

手順

以下の1行を追加
f:id:tomoTaka:20141012080125p:image

任意のフォルダを作成しsourceをclone

mkdir openjfx
cd openjfx
hg clone http://hg.openjdk.java.net/openjfx/8u-dev/rt

ここにも書いているようにtaskを確認。cloneすると「rt」フォルダが作成されているので「rt」に移動してからgraldeのコマンドを実施
(1回目はここで「rt」フォルダに移動しないでtaskコマンドがうまくいかなくて困っていました^^;;)

cd rt
gralde tasks

cloneして初めてtasksを実行すると少し時間がかかって無事成功
f:id:tomoTaka:20141012082726p:image
同じコマンドtasksを再度実行すると実行可能なコマンド一覧が表示
f:id:tomoTaka:20141012082743p:image

gradle clean
gradle projects

f:id:tomoTaka:20141012083131p:image

gradle --profile

エラー発生
f:id:tomoTaka:20141012085326p:image
Building OpenJFX on Mac OS X 10.9.2 / XCode 5.1 / XCode 4.3.3 を参考にして以下のコマンドを実行

sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk

無事成功!「build/reports/profile」配下に作成されているhtmlファイルを確認
f:id:tomoTaka:20141012085851p:image:w360

gradle

成功!

gradle base:test

成功!「modules/base/build/reports/tests」配下に作成されているhtmlファイルを確認
f:id:tomoTaka:20141012091631p:image:w360
とりあえずテストが成功しました!

tomoTaka
tomoTaka