﻿{"id":2422,"date":"2017-12-06T02:28:17","date_gmt":"2017-12-05T17:28:17","guid":{"rendered":"http:\/\/yucchi.jp\/blog\/?p=2422"},"modified":"2017-12-06T02:28:59","modified_gmt":"2017-12-05T17:28:59","slug":"%e4%bb%8a%e3%81%95%e3%82%89%e3%81%a0%e3%81%91%e3%81%a9-javafx-%e3%81%a7%e9%9d%9e%e5%90%8c%e6%9c%9f%e5%87%a6%e7%90%86","status":"publish","type":"post","link":"http:\/\/yucchi.jp\/blog\/?p=2422","title":{"rendered":"\u4eca\u3055\u3089\u3060\u3051\u3069 JavaFX \u3067\u975e\u540c\u671f\u51e6\u7406"},"content":{"rendered":"<p>\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u306f\u3001<a href=\"https:\/\/qiita.com\/advent-calendar\/2017\/javafx\" target=\"_blank\">JavaFX Advent Calendar 2017<\/a> \u306e 6 \u65e5\u76ee\u3067\u3059\u3002<\/p>\n<p>\u6628\u65e5\u306f <a href=\"https:\/\/qiita.com\/planet-az\">@planet-az<\/a> \u3055\u3093\u306e\u300c<a href=\"http:\/\/planet-az.hatenablog.com\/entry\/2017\/12\/05\/143000\">\u7c21\u5358\u306a\u30df\u30e5\u30fc\u30b8\u30c3\u30af\u30d7\u30ec\u30fc\u30e4\u30fc\u3092\u4f5c\u3063\u3066\u307f\u305f<\/a>\u300d\u3067\u3057\u305f\u3002<\/p>\n<p>\u660e\u65e5\u306f\u3053\u306e\u8a18\u4e8b\u3092\u66f8\u3044\u3066\u3044\u308b\u73fe\u6642\u70b9\u3067\u306f\u307e\u3060\u7a7a\u3044\u3066\u307e\u3059\u3002(^_^;\u3000\u304d\u3063\u3068\u8ab0\u304b\u304c\u7d20\u6575\u306a\u8a18\u4e8b\u3092\u6295\u7a3f\u3057\u3066\u304f\u308c\u308b\u3068\u697d\u3057\u307f\u306b\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u4eca\u3055\u3089\u3067\u3059\u304c JavaFX \u306e\u975e\u540c\u671f\u51e6\u7406\u3092\u5fa9\u7fd2\u304c\u3066\u3089\u7c21\u5358\u306b\u307f\u3066\u3044\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u3067\u306f\u3001\u6b21\u306e\u3088\u3046\u306a\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u3063\u3066\u307f\u307e\u3059\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2017\/12\/1.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"1\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"1\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2017\/12\/1_thumb.png\" width=\"226\" height=\"261\"><\/a><\/p>\n<p>long result = 1;<\/p>\n<p>for (int i = 0; i &lt; repeatProcessingNumber; i++) {<\/p>\n<p>result += result;<\/p>\n<p>\u521d\u671f\u5024 1 \u3067\uff11\uff10\u56de\u30eb\u30fc\u30d7\u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u3059\u3002<\/p>\n<p>\u8a08\u7b97\u7d42\u4e86\u5f8c\u306f 1024 \u3068\u7d50\u679c\u3092\u8868\u793a\u3057\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u3060\u3051\u3067\u306f\u6642\u9593\u306e\u304b\u304b\u308b\u51e6\u7406\u3068\u306f\u306a\u3089\u306a\u3044\u306e\u3067<\/p>\n<p>TimeUnit.MILLISECONDS.sleep(500);<\/p>\n<p>\u3068\u30b9\u30ec\u30c3\u30c9\u3092\u30b9\u30ea\u30fc\u30d7\u3055\u305b\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u72b6\u614b\u3001\u8a08\u7b97\u4e2d\u306e\u5024\u306e\u8868\u793a\u3084\u30ad\u30e3\u30f3\u30bb\u30eb\u306a\u3069\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u8868\u793a\u3001\u30d7\u30ed\u30b0\u30ec\u30b9\u30d0\u30fc\u306b\u3088\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u9032\u6357\u72b6\u614b\u306e\u53ef\u8996\u5316\u306a\u3069\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n<p>\u601d\u8003\u505c\u6b62\u72b6\u614b\u3067\u30ae\u30ca\u30ae\u30ca\u3063\u3068\u4f5c\u3063\u305f\u30d7\u30ed\u30b0\u30e9\u30e0\u306f\u6b21\u306e\u3088\u3046\u306a\u3082\u306e\u3067\u3059\u3002<\/p>\n<p><font color=\"#ff0000\"><strong>Warning! This code will make you headache.<\/strong><\/font><\/p>\n<p><font color=\"#ff0000\"><strong>You do not have to read it.<\/strong><\/font><\/p>\n<pre title=\"BadAsynchronousProcessing4JavaFX.java\">package jp.yucchi.badasynchronousprocessing4javafx;\r\n\r\nimport java.util.concurrent.TimeUnit;\r\nimport java.util.logging.Level;\r\nimport java.util.logging.Logger;\r\nimport javafx.application.Application;\r\nimport javafx.geometry.Insets;\r\nimport javafx.scene.Scene;\r\nimport javafx.scene.control.Button;\r\nimport javafx.scene.control.Label;\r\nimport javafx.scene.control.ProgressBar;\r\nimport javafx.scene.layout.FlowPane;\r\nimport javafx.stage.Stage;\r\n\r\n\/**\r\n *\r\n * @author Yucchi\r\n *\/\r\npublic class BadAsynchronousProcessing4JavaFX extends Application {\r\n\r\n    private Label statusLabel;\r\n    private Label messageLabel;\r\n    private Label interimResult;\r\n    private Label resultLabel;\r\n    private ProgressBar progressBar;\r\n    private Button startButton;\r\n    private Button cancelButton;\r\n    private boolean cancelFlag;\r\n\r\n    @Override\r\n    public void start(Stage primaryStage) {\r\n        System.out.println(cancelFlag);\r\n\r\n        statusLabel = new Label(\"STATUS\");\r\n        statusLabel.setMinWidth(200);\r\n        messageLabel = new Label(\"MESSAGE\");\r\n        messageLabel.setMinWidth(200);\r\n        interimResult = new Label(\"INTERIM RESULT\");\r\n        interimResult.setMinWidth(200);\r\n        resultLabel = new Label(\"RESULT\");\r\n        resultLabel.setMinWidth(200);\r\n        progressBar = new ProgressBar(0);\r\n        progressBar.setMinWidth(200);\r\n        startButton = new Button(\"START\");\r\n        startButton.setMinWidth(200);\r\n        cancelButton = new Button(\"CANCEL\");\r\n        cancelButton.setMinWidth(200);\r\n        cancelButton.setDisable(true);\r\n\r\n        FlowPane root = new FlowPane();\r\n        root.setPadding(new Insets(10));\r\n        root.setHgap(10);\r\n        root.setVgap(10);\r\n        root.getChildren().addAll(statusLabel, messageLabel, interimResult, resultLabel, progressBar, startButton, cancelButton);\r\n\r\n        Scene scene = new Scene(root, 220, 225);\r\n\r\n        primaryStage.setTitle(this.getClass().getSimpleName());\r\n        primaryStage.setScene(scene);\r\n        primaryStage.show();\r\n\r\n        primaryStage.setOnCloseRequest(we -&gt; {\r\n\r\n        });\r\n\r\n        startButton.setOnAction(ae -&gt; {\r\n            resultLabel.setText(\"RESULT\");\r\n            executeTask();\r\n        });\r\n\r\n        cancelButton.setOnAction(ae -&gt; {\r\n            startButton.setDisable(false);\r\n            cancelButton.setDisable(true);\r\n            statusLabel.setText(\"CANCELED\");\r\n            messageLabel.setText(\"Cancelled!\");\r\n            progressBar.setProgress(0.0);\r\n            interimResult.setText(\"INTERIM RESULT\");\r\n            cancelFlag = true;\r\n        });\r\n    }\r\n\r\n    \/**\r\n     * @param args the command line arguments\r\n     *\/\r\n    public static void main(String[] args) {\r\n        launch(args);\r\n    }\r\n\r\n    private void executeTask() {\r\n\r\n        startButton.setDisable(true);\r\n        cancelButton.setDisable(false);\r\n\r\n        int repeatProcessingNumber = 10;\r\n        long result = 1;\r\n        statusLabel.setText(\"RUNNING\");\r\n        messageLabel.setText(\"Start!\");\r\n        interimResult.setText(String.valueOf(result));\r\n        progressBar.setProgress(0);\r\n\r\n        for (int i = 0; i &lt; repeatProcessingNumber; i++) {\r\n\r\n            if (cancelFlag) {\r\n                System.out.println(\"This program has been canceled.\");\r\n                break;\r\n            }\r\n\r\n            try {\r\n                TimeUnit.MILLISECONDS.sleep(500);\r\n\r\n            } catch (InterruptedException ex) {\r\n                Logger.getLogger(BadAsynchronousProcessing4JavaFX.class.getName()).log(Level.SEVERE, null, ex);\r\n                if (cancelFlag) {\r\n                    System.out.println(\"This program has been canceled.\");\r\n                    break;\r\n                }\r\n            }\r\n\r\n            result += result;\r\n            messageLabel.setText(String.format(\"%d\/%d\", i + 1, repeatProcessingNumber));\r\n            interimResult.setText(String.valueOf(result));\r\n            progressBar.setProgress(i);\r\n\r\n        }\r\n\r\n        if (!cancelFlag) {\r\n            statusLabel.setText(\"SUCCEEDED\");\r\n            resultLabel.setText(String.valueOf(result));\r\n        } else {\r\n            cancelFlag = false;\r\n        }\r\n\r\n        startButton.setDisable(false);\r\n        cancelButton.setDisable(true);\r\n\r\n    }\r\n\r\n}\r\n\r\n<\/pre>\n<p>\u305d\u308c\u3067\u306f\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u5b9f\u884c\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2017\/12\/2.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"2\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"2\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2017\/12\/2_thumb.png\" width=\"226\" height=\"261\"><\/a><\/p>\n<p>\u300cSTART\u300d \u30dc\u30bf\u30f3\u3092\u62bc\u3057\u305f\u77ac\u9593\u30d7\u30ed\u30d6\u30e9\u30e0\u304c\u30d5\u30ea\u30fc\u30ba\u3057\u305f\u3088\u3046\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<p>\u305d\u3057\u3066\u66ab\u304f\u3059\u308b\u3068\u7d50\u679c\u304c\u8868\u793a\u3055\u308c\u307e\u3057\u305f\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2017\/12\/3.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"3\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"3\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2017\/12\/3_thumb.png\" width=\"226\" height=\"261\"><\/a><\/p>\n<p>\u3053\u308c\u306f\u99c4\u76ee\u3067\u3059\u306d\u3002(&gt;_&lt;\uff61)<\/p>\n<p>\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u30d3\u30b8\u30fc\u72b6\u614b\u3067\u5fdc\u7b54\u3057\u306a\u304f\u306a\u3063\u3066\u3057\u307e\u3063\u3066\u306f\u4f7f\u3044\u7269\u306b\u306a\u308a\u307e\u305b\u3093\u3002<\/p>\n<p>\u9032\u6357\u72b6\u614b\u304c\u308f\u304b\u3089\u306a\u3044\u306e\u306f\u81f4\u547d\u7684\u3067\u3059\u3002<\/p>\n<p>\u305d\u3057\u3066\u5510\u7a81\u306b\u8a08\u7b97\u304c\u7d42\u4e86\u3057\u3066\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u5b8c\u4e86\u3059\u308b\u3002<\/p>\n<p>\u305d\u3046\u8a00\u3048\u3070\u9060\u3044\u6614\u306b\u3053\u306e\u3088\u3046\u306a\u72b6\u614b\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u5f53\u305f\u308a\u524d\u306e\u3088\u3046\u306b\u5b58\u5728\u3057\u3066\u3044\u305f\u3088\u3046\u306a\u6c17\u304c\u3059\u308b\u3002<\/p>\n<p>\u4eca\u306e\u6642\u4ee3\u3053\u3093\u306a\u306e\u306f\u7d76\u5bfe\u306b\u8a31\u3055\u308c\u307e\u305b\u3093\u3002<\/p>\n<p>\u4f55\u304c\u3044\u3051\u306a\u3044\u306e\u304b\uff1f<\/p>\n<p>\u305d\u308c\u306f\u6642\u9593\u306e\u304b\u304b\u308b\u51e6\u7406\u3092 JavaFX \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b9\u30ec\u30c3\u30c9\u4e0a\u3067\u884c\u3063\u3066\u3044\u308b\u304b\u3089\u3067\u3059\u3002<\/p>\n<p>NetBeans \u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u3067\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2017\/12\/4.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"4\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"4\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2017\/12\/4_thumb.png\" width=\"967\" height=\"683\"><\/a><\/p>\n<p>JavaFX Application Thread \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3092\u898b\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>START \u30dc\u30bf\u30f3\u3092\u62bc\u3057\u305f\u77ac\u9593\u306b\u6642\u9593\u306e\u304b\u304b\u308b\u51e6\u7406\uff08\u30b9\u30ec\u30c3\u30c9\u30b9\u30ea\u30fc\u30d7\uff09\u304c\u8d70\u3063\u3066\u307e\u3059\u3002\uff08\u7dd1\u8272\u304b\u3089\u7d2b\u8272\u306b\u5909\u308f\u3063\u3066\u3044\u308b\u3068\u3053\u308d\uff09<\/p>\n<p>\u3053\u308c\u3067\u306f UI \u306e\u66f4\u65b0\u51e6\u7406\u306a\u3069\u306f\u3067\u304d\u307e\u305b\u3093\u306d\u3002<\/p>\n<p>\u6642\u9593\u306e\u304b\u304b\u308b\u51e6\u7406\u3092\u3057\u3066\u3044\u308b\u9593\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5fdc\u7b54\u306f\u7121\u304f\u306a\u308a\u3001\u30d3\u30b8\u30fc\u72b6\u614b\u306e\u3088\u3046\u306b\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3059\u3002<\/p>\n<p>\u3064\u307e\u308a\u3001\u6642\u9593\u306e\u304b\u304b\u308b\u51e6\u7406\u7528\u306b\u30b9\u30ec\u30c3\u30c9\u3092\u3082\u3046\u4e00\u3064\u8d77\u3053\u305b\u3070\u3053\u306e\u554f\u984c\u306f\u89e3\u6c7a\u3059\u308b\u306f\u305a\u3067\u3059\u3002<\/p>\n<p>\u3053\u306e\u554f\u984c\u3092\u89e3\u6c7a\u3059\u308b\u306e\u306b\u6700\u9069\u306a\u65b9\u6cd5\u306f javafx.concurrent\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3059\u3002<\/p>\n<p>javafx.concurrent \u30d1\u30c3\u30b1\u30fc\u30b8\u306f\u3001Worker \u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3068\u30012\u3064\u306e\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u3067\u3042\u308b Task \u304a\u3088\u3073 Service \u30af\u30e9\u30b9\u3067\u69cb\u6210\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>Worker \u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306f\u3001\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\u4e0a\u306e Worker \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u72b6\u614b\u3001\u9032\u6357\u3092\u76e3\u8996\u53ef\u80fd\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u3067\u516c\u958b\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u72b6\u614b\u306f ReadOnlyObjectProperty&lt;Worker.State&gt; stateProperty \u3067\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u6b21\u306e\u3088\u3046\u306b Enum Worker.State \u3067\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<ul>\n<li><font size=\"2\">READY \u3000\u3000\u3000\u3000Worker\u304c\u307e\u3060\u5b9f\u884c\u3055\u308c\u3066\u304a\u3089\u305a\u3001\u5b9f\u884c\u306e\u6e96\u5099\u304c\u3067\u304d\u3066\u3044\u308b\u304b\u3001\u307e\u305f\u306fWorker\u304c\u518d\u521d\u671f\u5316\u3055\u308c\u305f\u3053\u3068\u3092\u793a\u3057\u307e\u3059\u3002<\/font>\n<li><font size=\"2\">SCHEDULED \u3000 Worker\u306e\u5b9f\u884c\u304c\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u304c\u3001\u73fe\u5728\u306f\u5b9f\u884c\u4e2d\u3067\u306f\u306a\u3044\u3053\u3068\u3092\u793a\u3057\u307e\u3059\u3002<\/font>\n<li><font size=\"2\">RUNNING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u3053\u306eWorker\u304c\u5b9f\u884c\u4e2d\u3067\u3042\u308b\u3053\u3068\u3092\u793a\u3057\u307e\u3059\u3002<\/font>\n<li><font size=\"2\">SUCCEEDED \u3000 \u3053\u306eWorker\u304c\u6b63\u5e38\u306b\u5b8c\u4e86\u3057\u3066\u304a\u308a\u3001value\u30d7\u30ed\u30d1\u30c6\u30a3\u304b\u3089\u8aad\u307f\u53d6\u308b\u6e96\u5099\u304c\u3067\u304d\u3066\u3044\u308b\u6709\u52b9\u306a\u7d50\u679c\u304c\u3042\u308b\u3053\u3068\u3092\u793a\u3057\u307e\u3059\u3002<\/font>\n<li><font size=\"2\">CANCELLED&nbsp;&nbsp;&nbsp;&nbsp; \u3053\u306eWorker\u304cWorker.cancel()\u30e1\u30bd\u30c3\u30c9\u306b\u3088\u3063\u3066\u53d6\u308a\u6d88\u3055\u308c\u305f\u3053\u3068\u3092\u793a\u3057\u307e\u3059\u3002<\/font>\n<li><font size=\"2\">FAILED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u901a\u5e38\u306f\u4e88\u671f\u3057\u306a\u3044\u6761\u4ef6\u304c\u767a\u751f\u3057\u305f\u3053\u3068\u306b\u3088\u3063\u3066\u3001\u3053\u306eWorker\u304c\u5931\u6557\u3057\u305f\u3053\u3068\u3092\u793a\u3057\u307e\u3059\u3002<\/font><\/li>\n<\/ul>\n<p>\u3053\u308c\u3089\u306f JavaFX \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b9\u30ec\u30c3\u30c9\u304b\u3089\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>Worker \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u3088\u3063\u3066\u5b9f\u884c\u3055\u308c\u308b\u51e6\u7406\u306e\u9032\u6357\u306f\u3001totalWork\u3001workDone\u3001progress \u306a\u3069\u30013\u3064\u306e\u7570\u306a\u308b\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u901a\u3058\u3066\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>Worker \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u72b6\u614b\u304c\u5909\u5316\u3059\u308b\u3068\u304d\u306b\u767a\u751f\u3059\u308b\u30a4\u30d9\u30f3\u30c8\u306f WorkerStateEvent\u30af\u30e9\u30b9\u306b\u3088\u3063\u3066\u6307\u5b9a\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u306f Task \u30af\u30e9\u30b9\u3068 Service \u30af\u30e9\u30b9\u306e\u4e21\u65b9\u306b EventTarget \u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u304c\u5b9f\u88c5\u3055\u308c\u72b6\u614b\u30a4\u30d9\u30f3\u30c8\u306e\u30ea\u30b9\u30cb\u30f3\u30b0\u304c\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u304b\u3089\u3067\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306f\u518d\u5229\u7528\u306e\u5fc5\u8981\u304c\u7121\u3044 Worker \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u751f\u6210\u3059\u308b\u306e\u3067 Task \u30af\u30e9\u30b9\u3092\u5229\u7528\u3057\u307e\u3059\u3002<\/p>\n<p>\u4e0a\u8a18\u306e\u3088\u3046\u306b JavaFX \u306e Task \u30af\u30e9\u30b9\u306f FutureTask \u30af\u30e9\u30b9\u306e\u5b8c\u5168\u306b\u76e3\u8996\u53ef\u80fd\u306b\u3057\u305f\u5b9f\u88c5\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e Task \u30af\u30e9\u30b9\u3092\u62e1\u5f35\u3057\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\u3067\u5b9f\u884c\u3059\u308b\u30ed\u30b8\u30c3\u30af\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n<p>\u61d0\u304b\u3057\u306eSwingWorker \u30af\u30e9\u30b9\u3092\u601d\u3044\u51fa\u3055\u305b\u3066\u304f\u308c\u307e\u3059\u306d\u3002\uff08\u3082\u3046\u3001\u307b\u3068\u3093\u3069\u899a\u3048\u3066\u306a\u3044\u3051\u3069\u306d\uff09<\/p>\n<p>SwingWorker \u3067\u306f doInBackground() \u30e1\u30bd\u30c3\u30c9\u306b\u3066\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\u30ed\u30b8\u30c3\u30af\u3092\u547c\u3073\u51fa\u3057\u307e\u3059\u3002<\/p>\n<p>JavaFX \u306e\u5834\u5408\u306f call() \u30e1\u30bd\u30c3\u30c9\u3067\u3059\u3002<\/p>\n<p>doInBackground() \u30e1\u30bd\u30c3\u30c9\u3001call() \u30e1\u30bd\u30c3\u30c9\u3068\u3082\u306b\u3069\u3061\u3089\u3082\u62bd\u8c61\u30e1\u30bd\u30c3\u30c9\u306a\u306e\u3067\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3057\u3066\u4f7f\u3044\u307e\u3059\u3002<\/p>\n<p>call() \u30e1\u30bd\u30c3\u30c9\u306f Task \u30af\u30e9\u30b9\u304c\u5b9f\u884c\u3055\u308c\u308b\u3068\u304d\u306b\u547c\u3073\u51fa\u3055\u308c\u3001call() \u30e1\u30bd\u30c3\u30c9\u306b\u5b9f\u88c5\u3055\u308c\u305f\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\u30ed\u30b8\u30c3\u30af\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<p>\u3064\u307e\u308a\u3001\u4ed5\u7d44\u307f\u7684\u306b\u306f SwingWorker \u3068\u307b\u3068\u3093\u3069\u5909\u308f\u308a\u306f\u306a\u3044\u306e\u3067\u99b4\u67d3\u307f\u3084\u3059\u3044\u304b\u3082\u77e5\u308c\u307e\u305b\u3093\u3002<\/p>\n<p>\u3055\u3066\u3001JavaFX \u306e\u305f\u3081\u306b\u7528\u610f\u3055\u308c\u305f\u306e\u306b\u3053\u308c\u3060\u3051\u3067\u306f\u3042\u307e\u308a\u610f\u5473\u304c\u3042\u308a\u307e\u305b\u3093\u3002<\/p>\n<p>\u3053\u306e Task \u30af\u30e9\u30b9\u306e\u5b9f\u884c\u306b\u3042\u305f\u308a updateProgress() \u30e1\u30bd\u30c3\u30c9\u3001updateMessage() \u30e1\u30bd\u30c3\u30c9\u3001updateValue() \u30e1\u30bd\u30c3\u30c9\u3001updateTitle() \u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u3089\u3092\u4f7f\u7528\u3059\u308b\u3068\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u72b6\u614b\u3001\u9032\u6357\u72b6\u6cc1\u3001\u5b9f\u884c\u4e2d\u306e\u51e6\u7406\u306e\u7d50\u679c\u306e\u4e00\u90e8\u3092\u8fd4\u3059\u306a\u3069\u3092\u53ef\u8996\u5316\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u3061\u3087\u3063\u3068 updateValue() \u30e1\u30bd\u30c3\u30c9\u306e\u5b9f\u88c5\u3092\u307f\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre title=\"AsynchronousProcessing4JavaFX.java\">    protected void updateValue(V value) {\r\n        if (isFxApplicationThread()) {\r\n            this.value.set(value);\r\n        } else {\r\n            \/\/ As with the workDone, it might be that the background thread\r\n            \/\/ will update this value quite frequently, and we need\r\n            \/\/ to throttle the updates so as not to completely clobber\r\n            \/\/ the event dispatching system.\r\n            if (valueUpdate.getAndSet(value) == null) {\r\n                runLater(() -&gt; Task.this.value.set(valueUpdate.getAndSet(null)));\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p>\u547c\u3073\u51fa\u3057\u304c JavaFX \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b9\u30ec\u30c3\u30c9\u304b\u305d\u3046\u3067\u306a\u3044\u304b\u3067\u5206\u5c90\u51e6\u7406\u3092\u304a\u3053\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>JavaFX \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b9\u30ec\u30c3\u30c9\u304b\u3089\u3060\u3063\u305f\u3089\u305d\u306e\u307e\u307e\u5024\u3092\u66f4\u65b0\u3057\u307e\u3059\u3002<\/p>\n<pre title=\"AsynchronousProcessing4JavaFX.java\">    void runLater(Runnable r) {\r\n        Platform.runLater(r);\r\n    }\r\n<\/pre>\n<p>\u3067\u306a\u3051\u308c\u3070 runLater()\u30e1\u30bd\u30c3\u30c9\u3067 javafx.application.Platform \u30af\u30e9\u30b9\u306e runLater(Runnable runnable) \u30e1\u30bd\u30c3\u30c9\u3092\u547c\u3073\u51fa\u3057\u3066\u5024\u3092\u66f4\u65b0\u3057\u307e\u3059\u3002<\/p>\n<p>\u4f55\u6545\u306a\u3089\u3001<font color=\"#ff0000\"><strong>JavaFX Scene\u30b0\u30e9\u30d5\u306f\u3001\u30b9\u30ec\u30c3\u30c9\u30bb\u30fc\u30d5\u3067\u306f\u306a\u304f\u3001JavaFX\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b9\u30ec\u30c3\u30c9\u306e\u307f\u30a2\u30af\u30bb\u30b9\u304a\u3088\u3073\u5909\u66f4\u3067\u304d\u307e\u3059\u3002<\/strong><\/font><\/p>\n<p>\u3053\u308c\u306f Swing \u3067\u306f javax.swing.SwingUtilities \u30af\u30e9\u30b9\u306e invokeLater(Runnable doRun) \u30e1\u30bd\u30c3\u30c9\u3068\u540c\u3058\u3088\u3046\u306a\u3082\u306e\u3067\u3059\u3002<\/p>\n<p>JDK1.3 \u304b\u3089\u306f java.awt.EventQueue.invokeLater() \u3092\u547c\u3073\u51fa\u3059\u3088\u3046\u306b\u4f5c\u3089\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u306einvokeLater(Runnable doRun) \u30e1\u30bd\u30c3\u30c9\u306f\u3069\u306e\u30b9\u30ec\u30c3\u30c9\u304b\u3089\u3082\u547c\u3073\u51fa\u3057\u304c\u53ef\u80fd\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>javafx.application.Platform \u30af\u30e9\u30b9\u306e runLater(Runnable runnable) \u30e1\u30bd\u30c3\u30c9\u3082\u4efb\u610f\u306e\u30b9\u30ec\u30c3\u30c9\u304b\u3089\u547c\u3073\u51fa\u3057\u53ef\u80fd\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>updateProgress() \u30e1\u30bd\u30c3\u30c9\u3001updateMessage() \u30e1\u30bd\u30c3\u30c9\u3001updateValue() \u30e1\u30bd\u30c3\u30c9\u3001updateTitle() \u30e1\u30bd\u30c3\u30c9\u306e API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u306f\u300c\u3053\u306e\u30e1\u30bd\u30c3\u30c9\u306f\u3001\u4efb\u610f\u306e\u30b9\u30ec\u30c3\u30c9\u304b\u3089\u5b89\u5168\u306b\u547c\u3073\u51fa\u3059\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u300d<em>\u3068\u8a18\u8f09\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/em><\/p>\n<p><em>\u3061\u306a\u307f\u306b <\/em>updateValue()<em> \u30e1\u30bd\u30c3\u30c9<\/em>\u306f JavaFX 8 \u304b\u3089\u306a\u306e\u3067\u4e0a\u8a18\u306e\u3088\u3046\u306b\u30e9\u30e0\u30c0\u5f0f\u3092\u4f7f\u3044\u7dba\u9e97\u306b\u66f8\u304b\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u53e4\u304f\u304b\u3089\u3042\u308b updateMessage() \u30e1\u30bd\u30c3\u30c9\u306f\u6b21\u306e\u3088\u3046\u306b Java SE 7 \u306e\u6642\u4ee3\u306e\u30b3\u30fc\u30c9\u306e\u307e\u307e\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre title=\"AsynchronousProcessing4JavaFX.java\">    protected void updateMessage(String message) {\r\n        if (isFxApplicationThread()) {\r\n            this.message.set(message);\r\n        } else {\r\n            \/\/ As with the workDone, it might be that the background thread\r\n            \/\/ will update this message quite frequently, and we need\r\n            \/\/ to throttle the updates so as not to completely clobber\r\n            \/\/ the event dispatching system.\r\n            if (messageUpdate.getAndSet(message) == null) {\r\n                runLater(new Runnable() {\r\n                    @Override public void run() {\r\n                        final String message = messageUpdate.getAndSet(null);\r\n                        Task.this.message.set(message);\r\n                    }\r\n                });\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p>\u3053\u306e\u3088\u3046\u306a\u306e\u3092\u76ee\u306b\u3059\u308b\u3068 Java \u306f\u958b\u767a\u8005\u306e\u305f\u3081\u306b\u9032\u5316\u3057\u7d9a\u3051\u3066\u3044\u308b\u8a00\u8a9e\u306a\u3093\u3060\u306a\u3041\u3063\u3066\u611f\u6168\u6df1\u3044\u3082\u306e\u304c\u3042\u308a\u307e\u3059\u306d\u3002<\/p>\n<p>SwingWorker \u306e\u3088\u3046\u306b publish() \u30e1\u30bd\u30c3\u30c9\u3001process() \u30e1\u30bd\u30c3\u30c9\u306a\u3093\u3066\u306e\u306f JavaFX \u306b\u306f\u5fc5\u8981\u306a\u304f\u306a\u3063\u3066\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u3088\u3046\u306b\u3042\u308a\u304c\u305f\u3044\u6a5f\u80fd\u3092\u6a19\u6e96\u3067\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b Task \u30af\u30e9\u30b9\u3067\u3059\u304c\u3055\u3089\u306b\u4fbf\u5229\u306a\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u304b\u3089\u5148\u7a0b\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u6539\u5584\u3059\u308b\u306e\u306b\u3044\u304f\u3064\u304b\u306e Task \u30af\u30e9\u30b9\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n<p>\u305d\u308c\u3089\u30d7\u30ed\u30d1\u30c6\u30a3\u306f JavaFX \u306e\u30d0\u30a4\u30f3\u30c9\u3068\u3044\u3046\u6a5f\u80fd\u306b\u3088\u308a\u5feb\u9069\u306b\u4f7f\u7528\u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<p>JSR 295 Beans Binding \u3068\u540c\u3058\u3088\u3046\u306a\u3082\u306e\u3067\u3059\u3002<\/p>\n<p>\u5b9f\u969b\u306b\u3069\u306e\u3088\u3046\u306b\u5229\u7528\u3059\u308b\u304b\u3068\u3044\u3046\u3068 Task \u30af\u30e9\u30b9\u306e\u5b9f\u884c\u72b6\u614b\uff08Worker \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\uff09\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u5229\u7528\u3057\u3066\u300cSTART\u300d\u30dc\u30bf\u30f3\u3001\u300cCANCEL\u300d\u30dc\u30bf\u30f3\u306e\u6d3b\u6027\u5316\u3001\u975e\u6d3b\u6027\u5316\u3092\u304a\u3053\u306a\u3044\u307e\u3059\u3002<\/p>\n<p>\u307e\u305f\u3001\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\uff08Worker \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\uff09\u306e\u72b6\u614b\u3001\u8a08\u7b97\u7d50\u679c\u306e\u4e00\u90e8\u3092\u8fd4\u3059\u51e6\u7406\u3001\u30d7\u30ed\u30b0\u30ec\u30b9\u30d0\u30fc\u306b\u3088\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u9032\u6357\u72b6\u614b\u306e\u8868\u793a\u3082\u304a\u3053\u306a\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u3089\u306e\u5bfe\u5fdc\u3092\u65bd\u3057\u305f\u30d7\u30ed\u30b0\u30e9\u30e0\u306f\u6b21\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre title=\"AsynchronousProcessing4JavaFX.java\">package jp.yucchi.asynchronousprocessing4javafx;\r\n\r\nimport java.util.concurrent.ExecutorService;\r\nimport java.util.concurrent.Executors;\r\nimport java.util.concurrent.TimeUnit;\r\nimport java.util.logging.Level;\r\nimport java.util.logging.Logger;\r\nimport javafx.application.Application;\r\nimport javafx.concurrent.Task;\r\nimport static javafx.concurrent.Worker.State.RUNNING;\r\nimport javafx.geometry.Insets;\r\nimport javafx.scene.Scene;\r\nimport javafx.scene.control.Button;\r\nimport javafx.scene.control.Label;\r\nimport javafx.scene.control.ProgressBar;\r\nimport javafx.scene.layout.FlowPane;\r\nimport javafx.stage.Stage;\r\n\r\n\/**\r\n *\r\n * @author Yucchi\r\n *\/\r\npublic class AsynchronousProcessing4JavaFX extends Application {\r\n\r\n    private final ExecutorService executorService = Executors.newSingleThreadExecutor();\r\n    private Label statusLabel;\r\n    private Label messageLabel;\r\n    private Label interimResult;\r\n    private Label resultLabel;\r\n    private ProgressBar progressBar;\r\n    private Button startButton;\r\n    private Button cancelButton;\r\n\r\n    @Override\r\n    public void start(Stage primaryStage) {\r\n\r\n        statusLabel = new Label(\"STATUS\");\r\n        statusLabel.setMinWidth(200);\r\n        messageLabel = new Label(\"MESSAGE\");\r\n        messageLabel.setMinWidth(200);\r\n        interimResult = new Label(\"INTERIM RESULT\");\r\n        interimResult.setMinWidth(200);\r\n        resultLabel = new Label(\"RESULT\");\r\n        resultLabel.setMinWidth(200);\r\n        progressBar = new ProgressBar(0);\r\n        progressBar.setMinWidth(200);\r\n        startButton = new Button(\"START\");\r\n        startButton.setMinWidth(200);\r\n        cancelButton = new Button(\"CANCEL\");\r\n        cancelButton.setMinWidth(200);\r\n        cancelButton.setDisable(true);\r\n\r\n        FlowPane root = new FlowPane();\r\n        root.setPadding(new Insets(10));\r\n        root.setHgap(10);\r\n        root.setVgap(10);\r\n        root.getChildren().addAll(statusLabel, messageLabel, interimResult, resultLabel, progressBar, startButton, cancelButton);\r\n\r\n        Scene scene = new Scene(root, 220, 225);\r\n\r\n        primaryStage.setTitle(this.getClass().getSimpleName());\r\n        primaryStage.setScene(scene);\r\n        primaryStage.show();\r\n\r\n        primaryStage.setOnCloseRequest(we -&gt; {\r\n            executorService.shutdownNow();\r\n        });\r\n\r\n        startButton.setOnAction(ae -&gt; {\r\n            resultLabel.setText(\"RESULT\");\r\n            executeBackgroundTask();\r\n        });\r\n\r\n    }\r\n\r\n    public static void main(String[] args) {\r\n        launch(args);\r\n    }\r\n\r\n    private void executeBackgroundTask() {\r\n\r\n        Task&lt;Long&gt; task = new Task&lt;&gt;() {\r\n            @Override\r\n            public Long call() {\r\n\r\n                int repeatProcessingNumber = 10;\r\n                long result = 1;\r\n                updateMessage(\"Start!\");\r\n                updateValue(result);\r\n                updateProgress(0, repeatProcessingNumber);\r\n\r\n                for (int i = 0; i &lt; repeatProcessingNumber; i++) {\r\n                    if (isCancelled()) {\r\n                        System.out.println(\"This program has been canceled.\");\r\n                        break;\r\n                    }\r\n\r\n                    try {\r\n                        TimeUnit.MILLISECONDS.sleep(500);\r\n                    } catch (InterruptedException ex) {\r\n                        Logger.getLogger(AsynchronousProcessing4JavaFX.class.getName()).log(Level.SEVERE, null, ex);\r\n                        if (isCancelled()) {\r\n                            System.out.println(\"Canceled by InterruptedException.\");\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    result += result;\r\n                    updateMessage(String.format(\"%d\/%d\", i + 1, repeatProcessingNumber));;\r\n                    updateValue(result);\r\n                    updateProgress(i + 1, repeatProcessingNumber);\r\n                }\r\n\r\n                return result;\r\n\r\n            }\r\n\r\n            \/\/ Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u72b6\u614b\u304c\u5909\u5316\u3057\u305f\u3068\u304d\u306e\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u30e1\u30bd\u30c3\u30c9\uff08\uff15\u7a2e\u985e\uff09\r\n            @Override\r\n            protected void scheduled() {\r\n                super.succeeded();\r\n                updateMessage(\"scheduled!\");\r\n                System.out.println(\"Call scheduled()\");\r\n            }\r\n\r\n            @Override\r\n            protected void running() {\r\n                super.running();\r\n                updateMessage(\"running!\");\r\n                System.out.println(\"Call running()\");\r\n            }\r\n\r\n            @Override\r\n            protected void succeeded() {\r\n                super.succeeded();\r\n                updateMessage(\"Succeeded!\");\r\n                System.out.println(\"Call succeeded()\");\r\n                resultLabel.setText(\"RESULT: \" + getValue().toString());\r\n            }\r\n\r\n            @Override\r\n            protected void cancelled() {\r\n                super.cancelled();\r\n                updateMessage(\"Cancelled!\");\r\n                System.out.println(\"Call cancelled()\");\r\n                progressBar.progressProperty().unbind();\r\n                progressBar.setProgress(0.0);\r\n                interimResult.textProperty().unbind();\r\n                interimResult.setText(\"INTERIM RESULT\");\r\n            }\r\n\r\n            @Override\r\n            protected void failed() {\r\n                super.failed();\r\n                updateMessage(\"Failed!\");\r\n                System.out.println(\"Call failed()\");\r\n            }\r\n        };\r\n\r\n        \/\/ WorkerStateEven \u3092\u4f7f\u3063\u3066Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u72b6\u614b\u3092\u76e3\u8996\r\n        task.setOnScheduled(wse -&gt; System.out.println(\"setOnScheduled\"));\r\n        task.setOnRunning(wse -&gt; System.out.println(\"setOnRunning\"));\r\n        task.setOnSucceeded(wse -&gt; System.out.println(\"setOnSucceeded\"));\r\n        task.setOnCancelled(wse -&gt; System.out.println(\"setOnCancelled\"));\r\n        task.setOnFailed(wse -&gt; System.out.println(\"setOnFailed\"));\r\n\r\n        \/\/ textProperty \u3068 Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e stateProperty \u3092\u30d0\u30a4\u30f3\u30c9\r\n        statusLabel.textProperty().bind(task.stateProperty().asString());\r\n        \/\/ textProperty \u3068 Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e messageProperty \u3092\u30d0\u30a4\u30f3\u30c9\r\n        messageLabel.textProperty().bind(task.messageProperty());\r\n        \/\/ textProperty \u3068 Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e valueProperty \u3092\u30d0\u30a4\u30f3\u30c9\r\n        interimResult.textProperty().bind(task.valueProperty().asString());\r\n        \/\/ progressProperty \u3068 Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e progressProperty \u3092\u30d0\u30a4\u30f3\u30c9\r\n        progressBar.progressProperty().bind(task.progressProperty());\r\n        \/\/ disableProperty \u3068 Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e stateProperty \u3092\u30d0\u30a4\u30f3\u30c9\r\n        startButton.disableProperty().bind(task.stateProperty().isEqualTo(RUNNING));\r\n        cancelButton.disableProperty().bind(task.stateProperty().isNotEqualTo(RUNNING));\r\n\r\n        cancelButton.setOnAction(ae -&gt; {\r\n            task.cancel();\r\n        });\r\n\r\n        \/\/ ExecutorService \u3092\u5229\u7528\u3057\u3066\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\u3092\u958b\u59cb\r\n        executorService.submit(task);\r\n\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5b9f\u884c\u7d50\u679c\u3092\u898b\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2017\/12\/5.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"5\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"5\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2017\/12\/5_thumb.png\" width=\"226\" height=\"261\"><\/a><\/p>\n<p>\u3064\u3044\u3067\u306b NetBeans \u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30e9\u3067\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\u304c\u751f\u6210\u3055\u308c\u3066\u3044\u308b\u306e\u3092\u78ba\u8a8d\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2017\/12\/6.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"6\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"6\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2017\/12\/6_thumb.png\" width=\"804\" height=\"652\"><\/a><\/p>\n<p>pool-2-thread-1 \u304c\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\u3068\u3057\u3066\u8d77\u52d5\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u3067 JavaFX \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b9\u30ec\u30c3\u30c9\u306f\u30a4\u30d9\u30f3\u30c8\u51e6\u7406\u304c\u53ef\u80fd\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u753b\u9762\u304c\u56fa\u307e\u308b\u3053\u3068\u306a\u304f\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\u306e\u72b6\u614b\u3001\u8a08\u7b97\u7d50\u679c\u306e\u4e00\u90e8\uff08\u9014\u4e2d\u7d4c\u904e\uff09\u3001\u30d7\u30ed\u30b0\u30ec\u30b9\u30d0\u30fc\u3082\u8868\u793a\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u307e\u305f\u3001\u300cSTART\u300d\u30dc\u30bf\u30f3\u3001\u300cCANCEL\u300d\u30dc\u30bf\u30f3\u306e\u6d3b\u6027\u5316\u3001\u975e\u6d3b\u6027\u5316\u3082\u3061\u3083\u3093\u3068\u3067\u304d\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u307e\u305a\u3001Task \u30af\u30e9\u30b9\u3092\u307f\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>\u4eca\u56de\u306fcall() \u30e1\u30bd\u30c3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306b java.util.concurrent \u306e ExecutorService \u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3092\u5229\u7528\u3057\u307e\u3057\u305f\u3002<\/p>\n<p><font color=\"#000000\">184\u884c\u76ee\u3067\u3059\u3002<\/font><\/p>\n<p><font color=\"#666666\">executorService.submit(task);<\/font><\/p>\n<p>\u30bf\u30b9\u30af\u3092\u30d1\u30e9\u30e1\u30fc\u30bf\u3068\u3057\u3066\u6307\u5b9a\u3057\u305f\u30b9\u30ec\u30c3\u30c9\u306e\u958b\u59cb\u3068\u3057\u3066\u306f\u6b21\u306e\u65b9\u6cd5\u3082\u3042\u308a\u307e\u3059\u3002<\/p>\n<p><font color=\"#666666\">Thread th = new Thread(task);<br \/>th.setDaemon(true);<br \/>th.start();<\/font><\/p>\n<p>call() \u30e1\u30bd\u30c3\u30c9\u306b\u6642\u9593\u306e\u304b\u304b\u308b\u51e6\u7406\u3092\u8a18\u8ff0\u3057\u307e\u3059\u3002\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\u30ed\u30b8\u30c3\u30af\u3067\u3059\u3002<\/p>\n<p>call() \u30e1\u30bd\u30c3\u30c9\u304c\u547c\u3070\u308c\u305f\u3089\u521d\u671f\u5024\u3092\u30bb\u30c3\u30c8\u3057\u307e\u3059\u3002<\/p>\n<p>updateMessage() \u30e1\u30bd\u30c3\u30c9\u3001updateValue() \u30e1\u30bd\u30c3\u30c9\u3001updateProgress() \u30e1\u30bd\u30c3\u30c9\u306f\u30d7\u30ed\u30d1\u30c6\u30a3\u30d0\u30a4\u30f3\u30c9\u3092\u5229\u7528\u3057\u307e\u3059\u3002<\/p>\n<p>\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\u304c\u958b\u59cb\u3055\u308c\u305f\u3089\u30ad\u30e3\u30f3\u30bb\u30eb\u64cd\u4f5c\u304c\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u305f\u304b\u3082\u76e3\u8996\u3057\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u3002<\/p>\n<p>\u30ad\u30e3\u30f3\u30bb\u30eb\u306f java.\u200butil.\u200bconcurrent.\u200bFutureTask \u30af\u30e9\u30b9\u306e isCancelled() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3044\u307e\u3059\u3002<\/p>\n<p>\u4eca\u56de\u3001\u30b9\u30ec\u30c3\u30c9\u3092\u30b9\u30ea\u30fc\u30d7\u3055\u305b\u3066\u3044\u308b\u306e\u3067 InterruptedException \u3092\u30b9\u30ed\u30fc\u3059\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u307e\u305f InterruptedException \u306f Task \u306e\u30ad\u30e3\u30f3\u30bb\u30eb\u306e\u7d50\u679c\u3068\u3057\u3066\u767a\u751f\u3059\u308b\u5834\u5408\u304c\u3042\u308b\u305f\u3081\u3001\u78ba\u5b9f\u306b InterruptedException \u3092\u51e6\u7406\u3057\u3001\u30ad\u30e3\u30f3\u30bb\u30eb\u72b6\u614b\u3092\u8abf\u3079\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u305d\u308c\u306b\u5bfe\u5fdc\u3059\u308b\u305f\u3081\u306b 102 \u884c\u76ee\u306e catch \u7bc0\u306e\u3068\u3053\u308d\u306b\u3082 isCancelled() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u3088\u3046\u306b\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\u30ed\u30b8\u30c3\u30af\u5185\u306b\u30d6\u30ed\u30c3\u30ad\u30f3\u30b0\u30fb\u30b3\u30fc\u30eb\u304c\u3042\u308b\u5834\u5408\u306f\u6ce8\u610f\u304c\u5fc5\u8981\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30b9\u30ec\u30c3\u30c9\u3067\u306e\u51e6\u7406\u306e\u7d50\u679c\u306e\u4e00\u90e8\u3092\u8fd4\u3059\u305f\u3081\u306b 110 \u884c\u76ee\u306b updateValue() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3044\u307e\u3059\u3002<\/p>\n<p>\u540c\u69d8\u306b 109 \u884c\u76ee\u3067 messageLabel \u3001111 \u884c\u76ee\u3067 progressBar \u306e\u66f4\u65b0\u3082\u884c\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u3089\u306e\u66f4\u65b0\u306f JavaFX \u306e\u30d0\u30a4\u30f3\u30c9\u3068\u3044\u3046\u4fbf\u5229\u306a\u6a5f\u80fd\u3092\u4f7f\u3044\u307e\u3059\u3002<\/p>\n<p>Task \u30af\u30e9\u30b9\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u3068 Label \u306e\u30c6\u30ad\u30b9\u30c8\u30d7\u30ed\u30d1\u30c6\u30a3\u3001ProgressBar \u306e \u30d7\u30ed\u30b0\u30ec\u30b9\u30d7\u30ed\u30d1\u30c6\u30a3\u3068\u30d0\u30a4\u30f3\u30c9\u3057\u307e\u3059\u3002<\/p>\n<p>168 \u884c\u76ee\u304b\u3089\u6b21\u306e\u3088\u3046\u306b\u30d0\u30a4\u30f3\u30c9\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><font color=\"#666666\">\/\/ textProperty \u3068 Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e stateProperty \u3092\u30d0\u30a4\u30f3\u30c9<br \/>statusLabel.textProperty().bind(task.stateProperty().asString());<br \/>\/\/ textProperty \u3068 Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e messageProperty \u3092\u30d0\u30a4\u30f3\u30c9<br \/>messageLabel.textProperty().bind(task.messageProperty());<br \/>\/\/ textProperty \u3068 Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e valueProperty \u3092\u30d0\u30a4\u30f3\u30c9<br \/>interimResult.textProperty().bind(task.valueProperty().asString());<br \/>\/\/ progressProperty \u3068 Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e progressProperty \u3092\u30d0\u30a4\u30f3\u30c9<br \/>progressBar.progressProperty().bind(task.progressProperty());<\/font><\/p>\n<p>\u3053\u308c\u3067\u81ea\u52d5\u7684\u306b Task \u30af\u30e9\u30b9\uff08Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\uff09\u306e\u30d7\u30ed\u30d1\u30c6\u30a3 updateXXX() \u30e1\u30bd\u30c3\u30c9\u3067\u66f4\u65b0\u3055\u308c\u305f\u3089 Label \u3001ProgressBar \u3082\u66f4\u65b0\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u3082\u3057\u3001\u30ad\u30e3\u30f3\u30bb\u30eb\u64cd\u4f5c\u304c\u5b9f\u884c\u3055\u308c\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5b9f\u884c\u7d50\u679c\u306e\u4e00\u90e8\u304c\u8868\u793a\u3055\u308c\u305f\u307e\u307e\u306b\u306a\u308b\u306e\u304c\u5acc\u306a\u3089<\/p>\n<p>141 \u884c\u76ee\u306e Worker \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u72b6\u614b\u304c\u5909\u5316\u3057\u305f\u3068\u304d\u306e\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u30e1\u30bd\u30c3\u30c9\u3067\u3042\u308b cancelled() \u30e1\u30bd\u30c3\u30c9\u306e\u51e6\u7406\u3067\u3044\u3063\u305f\u3093 unbind() \u30e1\u30bd\u30c3\u30c9\u306b\u3088\u308a\u30d0\u30a4\u30f3\u30c9\u3092\u89e3\u9664\u3057\u3066\u521d\u671f\u5024\u3092\u8a2d\u5b9a\u3057\u76f4\u3059\u3068\u3044\u3044\u3067\u3057\u3087\u3046\u3002<\/p>\n<p><font color=\"#666666\">@Override<br \/>protected void cancelled() {<br \/>&nbsp;&nbsp;&nbsp; super.cancelled();<br \/>&nbsp;&nbsp;&nbsp; updateMessage(&#8220;Cancelled!&#8221;);<br \/>&nbsp;&nbsp;&nbsp; System.out.println(&#8220;Call cancelled()&#8221;);<br \/>&nbsp;&nbsp;&nbsp; progressBar.progressProperty().unbind();<br \/>&nbsp;&nbsp;&nbsp; progressBar.setProgress(0.0);<br \/>&nbsp;&nbsp;&nbsp; interimResult.textProperty().unbind();<br \/>&nbsp;&nbsp;&nbsp; interimResult.setText(&#8220;INTERIM RESULT&#8221;);<br \/>}<\/font><\/p>\n<p>\u3053\u306e\u3088\u3046\u306a\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u30e1\u30bd\u30c3\u30c9\u306f\u3053\u306e\u4ed6\u306b\u3082\u3042\u308a\u3001\u5168\u90e8\u3067\uff15\u7a2e\u985e\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u4fbf\u5229\u306b\u4f7f\u3048\u307e\u3059\u3002<\/p>\n<p>118 \u884c\u76ee\u304b\u3089 158 \u884c\u76ee\u3092\u53c2\u7167\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u30bf\u30b9\u30af\u304c\u7121\u4e8b\u306b\u7d42\u4e86\u3057\u305f\u3089 134 \u884c\u76ee\u306e succeeded() \u30e1\u30bd\u30c3\u30c9\u304c\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u3055\u308c\u307e\u3059\u3002<\/p>\n<p><font color=\"#666666\">@Override<br \/>protected void succeeded() {<br \/>&nbsp;&nbsp;&nbsp; super.succeeded();<br \/>&nbsp;&nbsp;&nbsp; updateMessage(&#8220;Succeeded!&#8221;);<br \/>&nbsp;&nbsp;&nbsp; System.out.println(&#8220;Call succeeded()&#8221;);<br \/>&nbsp;&nbsp;&nbsp; resultLabel.setText(&#8220;RESULT: &#8221; + getValue().toString());<br \/>}<\/font><\/p>\n<p>\u3053\u3053\u3067 Task \u30af\u30e9\u30b9\u306b\u623b\u308a\u5024\u304c\u3042\u308b\u5834\u5408\u305d\u308c\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<\/p>\n<p>\u623b\u308a\u5024\u306e\u578b\u306f\u30b8\u30a7\u30cd\u30ea\u30af\u30b9\u306e\u578b\u30d1\u30e9\u30fc\u30e1\u30bf\u30fc\u3067\u6307\u5b9a\u3055\u308c\u305f\u3082\u306e\u3067\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306f Long \u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u5fc5\u7136\u7684\u306b Call() \u30e1\u30bd\u30c3\u30c9\u306e\u623b\u308a\u5024\u3082 Long \u3067\u3059\u3002<\/p>\n<p>\u8a08\u7b97\u7d50\u679c\u306f 138 \u884c\u76ee\u3067 javafx.\u200bconcurrent.\u200bTask \u30af\u30e9\u30b9\u306e getValue() \u30e1\u30bd\u30c3\u30c9\u3067\u53d6\u5f97\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=\"#666666\">resultLabel.setText(&#8220;RESULT: &#8221; + getValue().toString());<\/font><\/p>\n<p>\u305d\u3057\u3066\u3001\u8a08\u7b97\u7d50\u679c\u3092 Label \u306e\u30c6\u30ad\u30b9\u30c8\u3068\u3057\u3066\u30bb\u30c3\u30c8\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u3089\u306e\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u30e1\u30bd\u30c3\u30c9\u306f JavaFX \u30a2\u30d7\u30ea\u30b1\u30b7\u30e7\u30f3\u30b9\u30ec\u30c3\u30c9\u4e0a\u3067\u5b9f\u884c\u3055\u308c\u308b\u306e\u3067 RuntimeException \u3082\u51fa\u307e\u305b\u3093\u3002<\/p>\n<p>\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u30e1\u30bd\u30c3\u30c9\u3092\u5229\u7528\u3059\u308b\u4ee5\u5916\u306b\u3082 WorkerStateEvent \u3092\u4f7f\u3063\u3066\u30a4\u30d9\u30f3\u30c8\u51e6\u7406\u3068\u3057\u3066\u6271\u3046\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>160 \u884c\u76ee\u304b\u3089 165 \u884c\u76ee\u306e\u3088\u3046\u306b\u30a4\u30d9\u30f3\u30c8\u30cf\u30f3\u30c9\u30e9\u3092\u767b\u9332\u3057\u3066\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n<p><font color=\"#666666\">\/\/ WorkerStateEven \u3092\u4f7f\u3063\u3066Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u72b6\u614b\u3092\u76e3\u8996<br \/>task.setOnScheduled(wse -&gt; System.out.println(&#8220;setOnScheduled&#8221;));<br \/>task.setOnRunning(wse -&gt; System.out.println(&#8220;setOnRunning&#8221;));<br \/>task.setOnSucceeded(wse -&gt; System.out.println(&#8220;setOnSucceeded&#8221;));<br \/>task.setOnCancelled(wse -&gt; System.out.println(&#8220;setOnCancelled&#8221;));<br \/>task.setOnFailed(wse -&gt; System.out.println(&#8220;setOnFailed&#8221;));<\/font><\/p>\n<p>\u3067\u306f\u3001\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u52d5\u304b\u3057\u305f\u3068\u304d\u306e Worker \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e state \u30d7\u30ed\u30d1\u30c6\u30a3 \u304c\u3069\u306e\u3088\u3046\u306b\u5909\u5316\u3059\u308b\u304b\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<p>\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u5b8c\u3059\u308b\u5834\u5408\u6b21\u306e\u3088\u3046\u306b\u51fa\u529b\u3055\u308c\u307e\u3059\u3002<\/p>\n<p><font color=\"#666666\">setOnScheduled<br \/>Call scheduled()<br \/>setOnRunning<br \/>Call running()<br \/>setOnSucceeded<br \/>Call succeeded()<\/font><\/p>\n<p>\u3053\u306e\u51fa\u529b\u7d50\u679c\u304b\u3089<\/p>\n<p><font color=\"#666666\">SCHEDULED<br \/>RUNNING<br \/>SUCCEEDED<\/font><\/p>\n<p>\u3068\u9077\u79fb\u3057\u3066\u3044\u308b\u306e\u304c\u89e3\u308a\u307e\u3059\u3002<\/p>\n<p>\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u9014\u4e2d\u3067\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u3066\u307f\u308b\u5834\u5408\u3082\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<p><font color=\"#666666\">setOnScheduled<br \/>Call scheduled()<br \/>setOnRunning<br \/>Call running()<br \/>setOnCancelled<br \/>Call cancelled()<br \/>Canceled by InterruptedException.<\/font><\/p>\n<p>\u4e88\u60f3\u901a\u308a\u306e\u7d50\u679c\u3067\u3059\u306d\u3002<\/p>\n<p><font color=\"#666666\">SCHEDULED<br \/>RUNNING<br \/>CANCELLED<\/font><\/p>\n<p>\u4e0a\u8a18\u306e\u3088\u3046\u306b\u9077\u79fb\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u308c\u3089\u306e\u52d5\u4f5c\u306f\u60f3\u50cf\u901a\u308a\u3067\u3057\u305f\u3002<\/p>\n<p>\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u30e1\u30bd\u30c3\u30c9\u3088\u308a WorkerStateEvent \u3092\u4f7f\u3063\u3066\u30a4\u30d9\u30f3\u30c8\u30cf\u30f3\u30c9\u30e9\u3092\u767b\u9332\u3057\u305f\u307b\u3046\u304c\u65e9\u3044\u7d50\u679c\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3060\u304b\u3089\u3068\u3044\u3063\u3066\u30e1\u30ea\u30c3\u30c8\u3001\u30c7\u30e1\u30ea\u30c3\u30c8\u304c\u3042\u308b\u304b\u3069\u3046\u304b\u306f\u79c1\u306b\u306f\u89e3\u308a\u307e\u305b\u3093\u3002<\/p>\n<p>\u3055\u3066\u3001\u6700\u5f8c\u306b\u3001\u300cSTART\u300d\u30dc\u30bf\u30f3\u3001\u300cCANCEL\u300d\u30dc\u30bf\u30f3\u306e\u6d3b\u6027\u5316\u3001\u975e\u6d3b\u6027\u5316\u3092\u307f\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>175 \u884c\u76ee\u304b\u3089 177 \u884c\u76ee\u3067\u3059\u3002<\/p>\n<p><font color=\"#666666\">\/\/ disableProperty \u3068 Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e stateProperty \u3092\u30d0\u30a4\u30f3\u30c9<br \/>startButton.disableProperty().bind(task.stateProperty().isEqualTo(RUNNING));<br \/>cancelButton.disableProperty().bind(task.stateProperty().isNotEqualTo(RUNNING));<br \/><\/font><\/p>\n<p>Button \u306e disableProperty \u3068 Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e stateProperty \u3092\u30d0\u30a4\u30f3\u30c9\u3057\u3066\u3044\u308b\u3060\u3051\u3067\u3059\u3002<\/p>\n<p>startButton \u306f Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e stateProperty \u304c RUNNING \u306a\u3089\u975e\u6d3b\u6027\u5316\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>cancelButton \u306f Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e stateProperty \u304c RUNNING \u3067\u306a\u3051\u308c\u3070\u975e\u6d3b\u6027\u5316\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u3064\u307e\u308a\u3001Worker\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e stateProperty \u304c RUNNING \u306e\u5834\u5408\u3060\u3051\u6d3b\u6027\u5316\u3057\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u3067\u3044\u3061\u3044\u3061\u64cd\u4f5c\u3092\u884c\u3046\u305f\u3073\u306b Button \u3092\u6d3b\u6027\u5316\u3001\u975e\u6d3b\u6027\u5316\u51e6\u7406\u3092\u8a18\u8ff0\u3057\u306a\u304f\u3066\u3059\u307f\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u3088\u3046\u306b JavaFX \u306b\u306f\u975e\u540c\u671f\u51e6\u7406\u3092\u7c21\u5358\u306b\u6271\u3046\u3053\u3068\u304c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>SwingWorker \u3092\u4f7f\u3063\u3066\u975e\u540c\u671f\u51e6\u7406\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u7d44\u3093\u3067\u3044\u308b\u306e\u306a\u3089 JavaFX \u306e javafx.concurrent\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u4f7f\u3063\u3066\u307f\u3066\u6642\u4ee3\u306e\u6d41\u308c\u3092\u611f\u3058\u53d6\u3063\u3066\u307f\u3066\u306f\u3044\u304b\u304c\u3067\u3057\u3087\u3046\u304b\u3002<\/p>\n<p>\u304a\u7d42\u3044\uff01<\/p>\n<p><font color=\"#ff80ff\" size=\"7\"><strong>I wish you a Merry Christmas.<\/strong><\/font><\/p>\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%3D2422&title=%E4%BB%8A%E3%81%95%E3%82%89%E3%81%A0%E3%81%91%E3%81%A9%20JavaFX%20%E3%81%A7%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86' 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%3D2422&t=%E4%BB%8A%E3%81%95%E3%82%89%E3%81%A0%E3%81%91%E3%81%A9%20JavaFX%20%E3%81%A7%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86' 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=2422\" ><\/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=2422\" data-text=\"\u4eca\u3055\u3089\u3060\u3051\u3069 JavaFX \u3067\u975e\u540c\u671f\u51e6\u7406\" data-lang=\"ja\">Tweet<\/a><\/div>\n    <\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u306f\u3001JavaFX Advent Calendar 2017 \u306e 6 \u65e5\u76ee\u3067\u3059\u3002 \u6628\u65e5\u306f @planet-az \u3055\u3093\u306e\u300c\u7c21\u5358\u306a\u30df\u30e5\u30fc\u30b8\u30c3\u30af\u30d7\u30ec\u30fc\u30e4\u30fc\u3092\u4f5c\u3063\u3066\u307f\u305f\u300d\u3067\u3057\u305f\u3002 \u660e\u65e5\u306f\u3053\u306e\u8a18\u4e8b\u3092\u66f8\u3044\u3066\u3044\u308b\u73fe\u6642\u70b9\u3067\u306f\u307e\u3060\u7a7a\u3044\u3066\u307e\u3059\u3002(^_^;\u3000\u304d\u3063\u3068\u8ab0\u304b\u304c\u7d20\u6575\u306a\u8a18\u4e8b\u3092\u6295\u7a3f\u3057\u3066\u304f\u308c\u308b\u3068\u697d\u3057\u307f\u306b\u3057\u3066\u3044\u307e\u3059\u3002 \u4eca\u3055\u3089\u3067\u3059\u304c JavaFX \u306e\u975e\u540c\u671f\u51e6\u7406\u3092\u5fa9\u7fd2\u304c\u3066\u3089\u7c21\u5358\u306b\u307f\u3066\u3044\u304d\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002 \u3067\u306f\u3001\u6b21\u306e\u3088\u3046\u306a\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u4f5c\u3063\u3066\u307f\u307e\u3059\u3002 long result = 1; for (int i = 0; i &lt; repeatProcessingNumber; i++) { result += \u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,12,4],"tags":[17,21,19],"class_list":["post-2422","post","type-post","status-publish","format-standard","hentry","category-java","category-javafx","category-netbeans","tag-java","tag-javafx","tag-netbeans"],"_links":{"self":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/2422","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=2422"}],"version-history":[{"count":1,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/2422\/revisions"}],"predecessor-version":[{"id":2423,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/2422\/revisions\/2423"}],"wp:attachment":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2422"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2422"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2422"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}