初日(12月4日)です。Jigsawのお勉強をしています。(^_^;)今回はJavaFXを使ってみます。そんなJavaFXですが正式リリース前からさらにリリースされてからもいろいろありました。現在はJavaにバンドルされていません。正確にはいろいろなところからJDKが提供されているのでひょっとしたらJavaFXをバンドルしたJavaがあるのかもしれません。今回はOpenJDKとOpenJFXを使います。11でjavafx.scene.control.Spinner<T>クラスにほんの少し優しい変更が追加されたのでそれを試してみました。8の750ms固定だったのが自由に変更できるようになりました。InitialDelayとRepeatDelayが設定可能となります。Spinnerについて少しだけ復習しておきましょう。SpinnerのAPIドキュメントに下記のように書かれています。順序付けられたシーケンスからユーザーが数値またはオブジェクト値を選択できるようにする単一行のテキスト・フィールド。通常、スピナーはシーケンスの要素間を移動するための小さな矢印ボタンのペアを提供します。キーボードの上/下矢印キーでも要素間を自由に移動できます。ユーザーがスピナーに直接(有効な)値を入力することもできます。UIコントロールのようにObservableListデータ・モデルを使用せずに、wrappingなどの機能や、より単純な’無限’データ・モデルの仕様(SpinnerValueFactory)を使用できるためです。Spinnerのシーケンス値はSpinnerValueFactoryで定義します。propertyを使用して変更できます。JavaFXには、次に示す一般的なタイプのSpinnerValueFactoryクラスが用意されています。•SpinnerValueFactory.IntegerSpinnerValueFactory•SpinnerValueFactory.DoubleSpinnerValueFactory•SpinnerValueFactory.ListSpinnerValueFactorySpinnerには、Spinnerの現在のvalueの表示および変更を行う、editorと呼ばれるTextField子コンポーネントがあります。propertyをtrueに設定すると、入力を受け入れることができます。propertyに対する変更をリスニングすることにより、値ファクトリとの同期を保ちます。ユーザーがeditorに表示された値を変更した場合、Spinnerのvalueとeditorの値が異なってしまう可能性があります。モデルの値をeditorの値と同じにするには、ユーザーが[Enter]キーを使用して編集をコミットする必要があります。APIドキュメントによると一般的なタイプのSpinnerValueFactoryクラスと使ってSpinnerインスタンスを作成できると書かれていました。factoryを設定する場合Spinnerインスタンスを作成するのは容易にできることが確認できたので次はSpinnerの定数フィールド値を使ってスタイルの設定方法を調べてみます。STYLE_CLASS_ARROWS_ON_LEFT_HORIZONTAL水平方向(左向きと右向き)の矢印がSpinnerの左側に配置されます。STYLE_CLASS_ARROWS_ON_LEFT_VERTICAL垂直方向(上向きと下向き)の矢印がSpinnerの左側に配置されます。STYLE_CLASS_ARROWS_ON_RIGHT_HORIZONTAL水平方向(左向きと右向き)の矢印がSpinnerの右側に配置されます。STYLE_CLASS_SPLIT_ARROWS_HORIZONTALSpinnerの左側に減分矢印、右側に増分矢印が配置されます。STYLE_CLASS_SPLIT_ARROWS_VERTICALスピナーの幅全体にわたって上下に伸びた矢印が配置されます。何も指定をしない場合はデフォルトの垂直方向(上向きと下向き)の矢印がSpinnerの右側に配置されます。Spinnerインスタンスの作成、スタイルの設定方法が解ったので試してみます。arg0)メソッドでSpinnerの定数フィールド値を追加して設定します。Spinnerの増分、減分の矢印ボタンの配置デザインの設定はこれで可能となりました。Spinnerに表示されている値のアライメントとカスタムフォントを設定してみます。CENTER_RIGHT;”);上の行でカスタムフォントを読み込んでその下の行でSpinnerにそのフォントを設定、テキストのサイズ、文字色、アライメントを設定しています。Spinneのエディタをユーザー入力可能とするspinner.setEditable(true);としてユーザー入力可能としてます。増分、減分のステップ量は変わらずユーザーによって入力された値からの増分値、減分値となります。最大値、最小値を超えることはありません。ここまでのプログラムのソースコードは次のようになります。{launch(args);}}それではSpinnerにInitialDelayとRepeatDelayを設定するプログラムを組んでみます。(openjfx-12-ea+2)を使ってみます。モジュラjarを作ってモジュール化します。jlinkで配布用にカスタムJREをバンドルしたアプリケーションを作成します。10.0-vc4を使ってお気楽に組もうとしたがこのバージョンには未対応なので古典的なツールを使いました。Devでプロジェクトをビルドし、jlinkでカスタムJRE組み込みアプリケーションの作成はできました。エラーバッジの嵐のエディタは心が痛みます。10.0-vc4を使って下記ファイルを作成します。なんかは対応していた。なんかは対応していた。included.");}}}プロジェクトの構成は下図のようにします。カスタムフォントを使うのでお気に入りのフォントをご用意ください。VMオプションをつけます。11からJavaFXはバンドルされなくなったのでそれらライブラリをダウンロードしてコンパイル、実行時にモジュールパスを指定します。JavaFXはこちらから入手できます。jmodsがあります。jmodsが必要となります。オプションでbin/IncludeeJavaFXディレクトリにコンパイルによって作成されるクラスファイルが格納されるようにしています。SDKのパスを指定します。–add-modulesオプションでアプリケーションで必要とされるモジュールを指定します。FXMLDocument.fxmlはコンパイルを実行しても出力ディレクトリbin/IncludeeJavaFXには移動、コピーされないので存在しません。FXMLDocument.fxmlをコンパイルして作成されたクラスファイルのある場所にコピーします。フォントを格納しているresourcesディレクトリもコピーします。プロジェクトの構成は下図のようになります。それでは実行してみましょう。VMオプションを忘れずに。–module-path、–add-modules、–moduleオプションも必要です。コンパイルされて実行できました。思いきや何やら妙な警告がでました。オプションをあたえます。12のリリースまでには修正されるのかな?それではこのプログラムをモジュラjar化してみます。modsディレクトリを作成してそこにモジュラjarを格納します。–module-versionでこのモジュールのバージョンを設定します。実行時メインクラスの指定をしなくていいように–main-classオプションを使ってメインクラスを指定してアプリケーションエントリポイントを設定します。モジュラjarがちゃんとできたか確認します。問題無さそうなのでプログラムを走らせてみます。SDKのパスを指定します。–moduleオプションはメインクラスの指定を省力できるようにしたのでモジュール名だけで実行できます。モジュール名/モジュールのメインクラス名とアプリケーションエントリポイント指定しなければいけません。IncludedJavaFX/jp.yucchi.includedjavafx.IncludedJavaFXとします。アプリケーションのモジュール化に成功し、ちゃんと動くことが確認できました。最後にjlinkで配布用にカスタムJREをバンドルしたアプリケーションを作成します。includedjavafx-imageディレクトリを作成しそこに成果物を格納します。–module-pathオプションでJDKとJavaFXのモジュールを指定します。jmodsのパスを指定することに注意してください。–add-modulesオプションでこのアプリケーション自体を指定します。–launcherオプションを次のように設定します。<コマンド名>=<モジュール名><メインクラス>–outputオプションで出力先を設定します。jlinkによって作成されたランチャーファイルにVMオプションを記述します。これを忘れると少し焦ります。(^_^;)動きましたね。JavaがインストールされてないPCでも動くことを確認しました。(Linux)ただしWindowsでは動きません。Windowsで動く配布用アプリはWindowsで作成しなくてはいけないようです。肝心のことを忘れていました。上のGifアニメで増分、減分ボタンを押しっぱなしにしている時のSpinnerの更新時間に注目してください。メソッドで押し続けて最初に更新される時間を設定しています。このプログラムでは解りやすくするために1500ミリ秒に設定しました。500ミリ秒と設定しました。750ミリ秒に固定されていて変更することができなかったので少しうれしいアップデートです。JavaFXになってほしい。Jigsawにもほんの少しだけ慣れてきたけど難しいですね。モジュールの依存関係を調べるのがお手軽にできるツールがあればいいのだけど・・・jdepsは万能ではないので落とし穴に落ちます。)今回のプログラムではFXMLを利用しています。JavaFXでGUIの構築にはとても便利です。javafx.fxml;とrequiresモジュールディレクティブ設定します。ところがそれだけではjava.lang.reflect.InvocationTargetExceptionが投げられます。FXMLを利用したJavaFXアプリケーションではjavafx.fxmlモジュール側からこのプログラムのFXMLのコントローラークラスに対してリフレクションによるアクセスがあります。モジュールのカプセル化はリフレクションにも適用されるからです。9より前はリフレクションを使えばパッケージ内の全てのクラスやクラスの全てのメンバーにアクセスできました。リフレクションは開発者の本意と関係なくカプセル化を破壊することが可能です。Jigsawでは強力で繊細なカプセル化が提供されています。デフォルトでは外部モジュールからモジュール内のクラスにアクセスすることはできません。外部モジュールからアクセスできるのはexportsされたパッケージの公開クラス、公開メンバだけなのです。非公開なメンバへのアクセスは外部モジュールから禁止されています。いった所でもモジュール化のメリットである依存性、公開範囲の制限が絡んでくるんですね。このリフレクションによるjavafx.fxmlモジュール側からのアクセスを許可する必要があります。それにはopens...toモジュール・ディレクティブを設定します。javafx.fxml;とopensモジュールディレクティブを付け加えるだけです。module-info.javaにこのモジュールディレクティブを加えることによって実行時にのみ特定のモジュールに対してパッケージへのアクセスを許可することが可能です。特定のパッケージ内のpublic型(およびネストされているpublic型とprotected型)に対して実行時にのみアクセスできることを指定可能となります。指定したパッケージのすべての型(およびその型のすべてのメンバ)にリフレクションを使ってアクセスすることもできます。9より前のものより開発者には喜ばれるはずですね。なるとjdepsのような依存性を解決する強力なツールの必要性が求められます。そのうち統合開発環境なんかに乗っかってくることを期待します。利用した人格診断プログラムです。(Bluemix)ライト・アカウントが気楽に使えるようになったので少し遊んでみました。リリースされてから随分経ちますので参考となる資料がネット上にあるのでググればなんとかそれなりのものは動かせるようです。つぶやきを解析して人格診断をおこなうプログラムを組んでみました。本家サイトではこんなデモがおかれています。自分のアカウントで試そうとしたけどエラーで駄目だったのでサンプルの方ので分析してみました。結果が上のスクリーンショットのようになります。分析データのスコアに関する説明は以下のようされています。スコアはすべて百分位数であり、膨大な集団の中での位置を表しています。外向性が90%という結果は、その人が90%外向的であることではなく、100人中その人より外向性の低い人が90人(高い人が10人)ということを意味しています。形式で返されてきます。これらの分析データの信頼性はどれ位のものかは想像もつかないのですがなかなか面白そうです。これらの技術を利用した面白いデモも用意されています。「自分のライトセーバーの色を見つけよう」です。生ける伝説と称されるジェダイ・マスターで絶対的存在となっています。(^_^)これはもっと詳しく人格診断してみたくなります。利用した人格診断プログラムを作るに当たり、分析データをレーダーチャートを使って表示させることにしました。標準で用意されているチャートにレーダーチャートは見当たりません。期待して見に行ったらレーダーチャートは無かった。(見落としていたらごめんなさい)これで一気に面倒くささハードルが上がった。お絵かき対応することにしました。できあがったプログラムを動かして人格診断を行った結果がこちらです。パーセントも性格が一致しているわりには・・・まぁ、人工知能が人の発言(ツイート)を分析して人格診断するとこんなもんですねと悔しいから言っておきます。(ヲヒせっかく年末の忙しい時期にゴニョゴニョしてプログラム組んだのにこれではあんまりだから現在の日本の内閣総理大臣である安倍晋三氏の人格診断をしてみた。スコアが凄い!やはり職業柄か誠実性、外向性のポイント高いですね。個々のスコアもそうかも知れないと思わせる結果です。)断っておきますが私は政治にあまり詳しくなくこの結果を利用して政治批判や誹謗中傷を行うことを目的としていません。テレビ等で見聞きする情報をもとにした感想です。それではもう一人診断してみましょう。私の好きな歌手の宇多田ヒカルさんです。ポイントが高いですね。生まれついての芸術家なのでしょう。この結果から私には個性が足りないことがバレてしまいました。年は個性をもう少しなんとかする年にしなければ。(^_^;そう言うことでこのプログラムのコードを載せておきます。酷いことを平気でしています。パスワード等はプログラムにハードコーディングしていますのでそこは適宜書き換えてくださいませ。あと、例外処理もほとんど対処していません。試してみたかったからです。それなりに手抜きプログラムにも対応してくれます。