﻿{"id":1255,"date":"2013-08-18T06:55:23","date_gmt":"2013-08-17T21:55:23","guid":{"rendered":"http:\/\/yucchi.jp\/blog\/?p=1255"},"modified":"2013-08-18T06:59:44","modified_gmt":"2013-08-17T21:59:44","slug":"imagegetter-javafx-%e3%81%a7%e3%81%ae%e8%a6%9a%e3%81%88%e6%9b%b8%e3%81%8d","status":"publish","type":"post","link":"http:\/\/yucchi.jp\/blog\/?p=1255","title":{"rendered":"ImageGetter (JavaFX) \u3067\u306e\u899a\u3048\u66f8\u304d"},"content":{"rendered":"<p>\u3053\u306e\u524d\u3001JavaFX \u306e\u5b66\u7fd2\u304c\u3066\u3089\u306b\u5275\u3063\u305f ImageGetter \u3068\u3044\u3046\u304a\u904a\u3073\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306e\u899a\u3048\u66f8\u304d\u3067\u3059\u3002<\/p>\n<p>\u30a4\u30e1\u30fc\u30b8\u3092\u53d6\u5f97\u3057\u3066\u753b\u50cf\u3092\u8868\u793a\u3055\u305b\u308b\u51e6\u7406\u3068\u3001\u305d\u306e\u753b\u50cf\u3092\u4fdd\u5b58\u3055\u305b\u308b\u51e6\u7406\u3092\u66f8\u3044\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<p>\u30d7\u30ed\u30b0\u30e9\u30e0\u5168\u4f53\u3092\u8f09\u305b\u3088\u3046\u3068\u601d\u3063\u305f\u306e\u3067\u3059\u304c\u7121\u99c4\u306b\u9577\u3044\u306e\u3068 JavaFX \u521d\u5fc3\u8005\u3068\u3044\u3046\u3053\u3068\u3082\u3042\u3063\u3066\u9593\u9055\u3063\u3066\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u306e\u3067\u3002(^_^;)<\/p>\n<p>\u898b\u305f\u3044\u3063\u3066\u4eba\u304c\u3044\u308c\u3070\u6687\u3092\u307f\u3064\u3051\u3066\u30d7\u30ed\u30b0\u30e9\u30e0\u5168\u4f53\u3092\u30a2\u30c3\u30d7\u3059\u308b\u304b\u8003\u3048\u307e\u3059\u3002<\/p>\n<p>\u89e3\u8aac\u306f\u7121\u3044\u3067\u3059\u304c\u4f55\u3092\u3057\u3066\u3044\u308b\u304b\u89e3\u308b\u3088\u3046\u306b\u30b3\u30e1\u30f3\u30c8\u3092\u3044\u308c\u3066\u3042\u308a\u307e\u3059\u3002<\/p>\n<pre title=\"FXMLDocumentController.java\">\r\n    @FXML\r\n    public void handleGet(ActionEvent event) {\r\n\r\n        \/\/ \u30a4\u30e1\u30fc\u30b8\u53d6\u5f97\u6642\u306b\u3053\u308c\u3089\u3092\u975e\u6d3b\u6027\u5316\u3059\u308b\r\n        prpgressIndicator.setVisible(true);\r\n        timeLimit.setDisable(true);\r\n        getButton.setDisable(true);\r\n        slider.setDisable(true);\r\n        effectCombo.setDisable(true);\r\n        saveButton.setDisable(true);\r\n        file.setDisable(true);\r\n        edit.setDisable(true);\r\n        exit.setDisable(true);\r\n        img.setDisable(true);\r\n        imgUrl_1.setDisable(true);\r\n        imgUrl_2.setDisable(true);\r\n        imgUrl_3.setDisable(true);\r\n\r\n        \/\/ Task \u30af\u30e9\u30b9\u3092\u4f7f\u3044 Image \u3092\u53d6\u5f97\u3057\u3001GUI \u3092\u66f4\u65b0\r\n        Task<Void> task = new Task<Void>() {\r\n\r\n            \/\/ \u623b\u308a\u5024\u306a\u3057\u306e\u975e\u540c\u671f\u51e6\u7406 ( \u30ad\u30e3\u30f3\u30bb\u30eb\u51e6\u7406\u306f\u7121\u3057 )\r\n            @Override\r\n            protected Void call() throws Exception {\r\n                \r\n                \/\/ ExecutorService \u8a2d\u5b9a\r\n                int procs = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors();\r\n                if (procs > 1) {\r\n                    procs = 2;\r\n                }\r\n                executor = Executors.newFixedThreadPool(procs);\r\n                \r\n                \/\/ CompletableFuture \u3092\u4f7f\u3044 Image \u3092\u53d6\u5f97\r\n                \/\/ works \u306f\u3001Image \u53d6\u5f97\u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\r\n                image = CompletableFuture.supplyAsync(() -> works.getImg(baseUrl, subUrl), executor);\r\n                image.thenRun(() -> {\r\n                });\r\n\r\n                try {\r\n                    target = image.get(limit, TimeUnit.SECONDS);\r\n                } catch (InterruptedException | ExecutionException | TimeoutException ex) {\r\n                    \/\/ Good catch! (In the latest Japan, it is an indispensable comment.)\r\n                    Image temp;\r\n                    if (limit < 5) {\r\n                        temp = new Image(getClass().getResource(\"TimeOut.png\").toString());\r\n                    } else {\r\n                        temp = new Image(getClass().getResource(\"out.png\").toString());\r\n                    }\r\n                    image.complete(temp);\r\n                }\r\n                try {\r\n                    target = image.get();\r\n                } catch (InterruptedException | ExecutionException ex1) {\r\n                    \/\/ Good catch! (In the latest Japan, it is an indispensable comment.)\r\n                    Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex1);\r\n                }\r\n\r\n                \/\/ GUI \u66f4\u65b0\r\n                Platform.runLater(() -> {\r\n                    imgView.setImage(target);\r\n                    timeLimit.setDisable(false);\r\n                    getButton.setDisable(false);\r\n                    slider.setDisable(false);\r\n                    effectCombo.setDisable(false);\r\n                    saveButton.setDisable(false);\r\n                    file.setDisable(false);\r\n                    edit.setDisable(false);\r\n                    exit.setDisable(false);\r\n                    img.setDisable(false);\r\n                    imgUrl_1.setDisable(false);\r\n                    imgUrl_2.setDisable(false);\r\n                    imgUrl_3.setDisable(false);\r\n                    prpgressIndicator.setVisible(false);\r\n                    Toolkit.getDefaultToolkit().beep();\r\n\r\n                    \/\/ ExecutorService \u6b62\u3081\u308b\r\n                    while (true) {\r\n                        if (image.isDone()) {\r\n                            executor.shutdown();\r\n                        }\r\n                        try {\r\n                            if (!executor.awaitTermination(2, TimeUnit.SECONDS)) {\r\n                                executor.shutdownNow();\r\n                                break;\r\n                            }\r\n                        } catch (InterruptedException ex) {\r\n                            \/\/ Good catch! (In the latest Japan, it is an indispensable comment.)\r\n                            Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);\r\n                        }\r\n                        break;\r\n                    }\r\n\r\n                });\r\n\r\n                return null;\r\n            }\r\n\r\n        };\r\n\r\n        new Thread(task).start();\r\n\r\n    }\r\n<\/pre>\n<pre title=\"FXMLDocumentController.java\">\r\n    @FXML\r\n    public void handleSave(ActionEvent event) {\r\n\r\n        \/\/ ImageView \u3060\u3051\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\r\n        WritableImage writableImage = imgView.snapshot(null, null);\r\n\r\n        \/\/ \u30d5\u30a1\u30a4\u30eb\u30c1\u30e5\u30fc\u30b6\r\n        File outFile = fileChooser.showSaveDialog(null);\r\n        \/\/ \u4fdd\u5b58\r\n        if (outFile != null) {\r\n            try {\r\n                ImageIO.write(SwingFXUtils.fromFXImage(writableImage, null), \"png\", outFile);\r\n            } catch (IOException ex) {\r\n                Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);\r\n            }\r\n        }\r\n\r\n    }\r\n<\/pre>\n<pre title=\"FXMLDocumentController.java\">\r\n    @Override\r\n    public void initialize(URL url, ResourceBundle rb) {\r\n\r\n\t................................................\r\n\r\n        \/\/ \u30d5\u30a1\u30a4\u30eb\u30c1\u30e5\u30fc\u30b6\r\n        fileChooser = new FileChooser();\r\n        \/\/ \u30bf\u30a4\u30c8\u30eb\r\n        fileChooser.setTitle(\"Save Image File\");\r\n        \/\/ \u30d5\u30a3\u30eb\u30bf\u30fc\r\n        fileChooser.getExtensionFilters()\r\n                .addAll(new ExtensionFilter(\"Image Files\", \"*.png\", \"*.jpg\", \"*.gif\"),\r\n                new ExtensionFilter(\"All Files\", \"*.*\"));\r\n    }\r\n<\/pre>\n<p>\u3042\u3068 ImageView \u306e\u30b5\u30a4\u30ba\u8abf\u6574\u306b ImageGetter.java \u306e starat \u30e1\u30bd\u30c3\u30c9\u306b<\/p>\n<pre title=\"ImageGetter.java\">        \r\n        FXMLDocumentController.imgView.fitWidthProperty().bind(stage.widthProperty().multiply(0.75));\r\n        FXMLDocumentController.imgView.fitHeightProperty().bind(stage.heightProperty().multiply(0.75));\r\n<\/pre>\n<p>\u3068\u3057\u3066\u307e\u3059\u3002<\/p>\n<p>\u7e2e\u5c0f\u7387\u306f\u9069\u5f53\u3067\u3059\u3002\uff08\u3084\u3063\u3066\u308b\u3053\u3068\u3082\u9069\u5f53\u3067\u3059\uff09<\/p>\n<p>\u3053\u3093\u306a\u3053\u3068\u3057\u306a\u304f\u3066\u3082\u826f\u3044\u65b9\u6cd5\u304c\u3042\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u304c\u89e3\u3089\u306a\u304b\u3063\u305f\u306e\u3067\u8ae6\u3081\u3066\u3053\u3046\u3057\u307e\u3057\u305f\u3002(^_^;)<\/p>\n<p>\u3042\u3068 Dialog \u3067\u3082\u5c11\u3057\u306f\u307e\u3063\u305f\u306e\u3067\u305d\u306e\u3053\u3068\u3082\u66f8\u3053\u3046\u304b\u3068\u601d\u3063\u305f\u306e\u3067\u3059\u304c\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u306a\u3044\u7121\u3044\u304b\u3089\u3084\u3081\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<p>\u306a\u3093\u3067 Dialog \u304c\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u306a\u3044\u306e\u304b\u7591\u554f\u3067\u3059\u304c\u3053\u306e\u5148\u3069\u3046\u306a\u308b\u306e\u304b\u307e\u3060\u89e3\u3089\u306a\u3044\u3067\u3059\u3057\u306d\u3002<\/p>\n<p>\u6700\u5f8c\u306b\u3001\u304f\u3069\u3044\u3088\u3046\u3067\u3059\u304c\u9593\u9055\u3063\u3066\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u306e\u3067\u304a\u304b\u3057\u306a\u3068\u3053\u308d\u304c\u3042\u308c\u3070\u7b11\u3063\u3066\u8a31\u3057\u3066\u304f\u3060\u3055\u3044\u306d\u3002(^_^)<\/p>\n<div id=\"scid:0767317B-992E-4b12-91E0-4F059A8CECA8:481bcaad-6cff-48c1-82a6-4a885156011a\" class=\"wlWriterEditableSmartContent\" style=\"float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px\">Hatena \u30bf\u30b0: <a href=\"http:\/\/b.hatena.ne.jp\/t\/JavaFX\" rel=\"tag\">JavaFX<\/a><\/div>\n<div class='wp_social_bookmarking_light'>\n            <div class=\"wsbl_hatena\"><a href='\/\/b.hatena.ne.jp\/add?mode=confirm&url=http%3A%2F%2Fyucchi.jp%2Fblog%2F%3Fp%3D1255&title=ImageGetter%20%28JavaFX%29%20%E3%81%A7%E3%81%AE%E8%A6%9A%E3%81%88%E6%9B%B8%E3%81%8D' title='\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0' rel=nofollow class='wp_social_bookmarking_light_a' target=_blank><img src='http:\/\/yucchi.jp\/blog\/wp-content\/plugins\/wp-social-bookmarking-light\/public\/images\/hatena.gif' alt='\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0' title='\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0' width='16' height='12' class='wp_social_bookmarking_light_img' \/><\/a><\/div>\n            <div class=\"wsbl_facebook\"><a href='http:\/\/www.facebook.com\/share.php?u=http%3A%2F%2Fyucchi.jp%2Fblog%2F%3Fp%3D1255&t=ImageGetter%20%28JavaFX%29%20%E3%81%A7%E3%81%AE%E8%A6%9A%E3%81%88%E6%9B%B8%E3%81%8D' title='Facebook \u306b\u30b7\u30a7\u30a2' rel=nofollow class='wp_social_bookmarking_light_a' target=_blank><img src='http:\/\/yucchi.jp\/blog\/wp-content\/plugins\/wp-social-bookmarking-light\/public\/images\/facebook.png' alt='Facebook \u306b\u30b7\u30a7\u30a2' title='Facebook \u306b\u30b7\u30a7\u30a2' width='16' height='16' class='wp_social_bookmarking_light_img' \/><\/a><\/div>\n            <div class=\"wsbl_google_plus_one\"><g:plusone size=\"medium\" annotation=\"none\" href=\"http:\/\/yucchi.jp\/blog\/?p=1255\" ><\/g:plusone><\/div>\n            <div class=\"wsbl_twitter\"><a href=\"https:\/\/twitter.com\/share\" class=\"twitter-share-button\" data-url=\"http:\/\/yucchi.jp\/blog\/?p=1255\" data-text=\"ImageGetter (JavaFX) \u3067\u306e\u899a\u3048\u66f8\u304d\" data-lang=\"ja\">Tweet<\/a><\/div>\n    <\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u306e\u524d\u3001JavaFX \u306e\u5b66\u7fd2\u304c\u3066\u3089\u306b\u5275\u3063\u305f ImageGetter \u3068\u3044\u3046\u304a\u904a\u3073\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306e\u899a\u3048\u66f8\u304d\u3067\u3059\u3002 \u30a4\u30e1\u30fc\u30b8\u3092\u53d6\u5f97\u3057\u3066\u753b\u50cf\u3092\u8868\u793a\u3055\u305b\u308b\u51e6\u7406\u3068\u3001\u305d\u306e\u753b\u50cf\u3092\u4fdd\u5b58\u3055\u305b\u308b\u51e6\u7406\u3092\u66f8\u3044\u3066\u304a\u304d\u307e\u3059\u3002 \u30d7\u30ed\u30b0\u30e9\u30e0\u5168\u4f53\u3092\u8f09\u305b\u3088\u3046\u3068\u601d\u3063\u305f\u306e\u3067\u3059\u304c\u7121\u99c4\u306b\u9577\u3044\u306e\u3068 JavaFX \u521d\u5fc3\u8005\u3068\u3044\u3046\u3053\u3068\u3082\u3042\u3063\u3066\u9593\u9055\u3063\u3066\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u306e\u3067\u3002(^_^;) \u898b\u305f\u3044\u3063\u3066\u4eba\u304c\u3044\u308c\u3070\u6687\u3092\u307f\u3064\u3051\u3066\u30d7\u30ed\u30b0\u30e9\u30e0\u5168\u4f53\u3092\u30a2\u30c3\u30d7\u3059\u308b\u304b\u8003\u3048\u307e\u3059\u3002 \u89e3\u8aac\u306f\u7121\u3044\u3067\u3059\u304c\u4f55\u3092\u3057\u3066\u3044\u308b\u304b\u89e3\u308b\u3088\u3046\u306b\u30b3\u30e1\u30f3\u30c8\u3092\u3044\u308c\u3066\u3042\u308a\u307e\u3059\u3002 @FXML public void handleGet(ActionEvent event) { \/\/ \u30a4\u30e1\u30fc\u30b8\u53d6\u5f97\u6642\u306b\u3053\u308c\u3089\u3092\u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[21],"class_list":["post-1255","post","type-post","status-publish","format-standard","hentry","category-javafx","tag-javafx"],"_links":{"self":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1255","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1255"}],"version-history":[{"count":3,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1255\/revisions"}],"predecessor-version":[{"id":1258,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1255\/revisions\/1258"}],"wp:attachment":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1255"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1255"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}