JavaFX

JDK8u40 で追加された Spinner と Dialog を試してみた。 とりあえず回避方法をみつけた。

JavaFX

JDK8u40 で追加された Spinner と Dialog を試してみた。

このエントリーで Arrow button をマウスクリックして操作した場合、呼び出す Dialog を Modality.APPLICATION_MODAL または Modality.WINDOW_MODAL に設定すると

Spinner のインクリメントもしくはデクリメントが止まらないという不思議な現象に悩まされました。

キーボードのカーソルキーでの操作では期待通りに正常に動きます。

なんでマウスで Arrow button をクリックして操作するといけないのか?

MousePressed がブロックされずに押しっぱなし状態で SpinnerBehavior クラスの startSpinning(boolean increment) の Timeline が動いちゃってるようです。

そこで、愚かなアイディアですが MouseReleased が発生してから Dialog を呼び出しちゃえってやってみたら期待通りに動いてくれました。

ごめんなさい。こんな方法しか思いつきませんでした。

と言うことでお終いです。

これってやっぱりバグなんだろうか?

追記:Jose Pereda さんよりコメントをいただきました。

それによると SpinnerSkin class に問題があるようです。

詳しくは Jose さんのコメントをご覧ください。

あわせてこの問題に対する素晴らしい解決方法を提示してくれましたのでエントリー本文にも記載させていただきます。

素晴らしいコードをありがとうございました。

Hatena タグ:

JDK8u40 で追加された Spinner と Dialog を試してみた。

JavaFX

JDK8u40 でやっと Dialog が追加されました。

これでお手軽に使えることになります。

あと Spinner も、そして Formatted Text も追加されました。

今回は Spinner と Dialog をサクッと使ってみたいと思います。

毎月のお小遣いの金額を Spinner で入力してある金額より低いもしくは高い場合に Dialog を出すという超シンプルなものです。

しかし、私はこれでドツボにはまり、未だに改善策を見いだせずに困っています。

心優しい優秀な Java プログラマのかたがこの記事を見ていたらどうか解決方法をお教えくださいませ。

Dialog の設定を Modality.APPLICATION_MODAL と Modality.WINDOW_MODAL にすると思わぬ事態が発生します。

それではプログラムのソースコード及び動画を貼っておきます。

Spinner の CSS のあてかたも解らないので入力値を右寄せにしたり色を変えたりとかもしたかったのですがそれはネット上に情報が出てきてからボチボチ勉強していきたいですね。

追記:キーボードからカーソルキー入力では問題ないのでバグの可能性が高いです。

Hatena タグ:

JavaFX の SplitPane を試してみた。

JavaFX

JavaFX の SplitPane の存在は知っていたが使う機会が無かったので使い方を知らないまま今日に至っています。

とりあえず簡単な使い方だけでも知っておこうとググってみたのですが日本語での情報を見つけることができませんでした。(>_<。)

しかたないので API ドキュメントをサラッと 読んで 眺めてみることにしました。

Class SplitPane

http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/SplitPane.html#getDividerPositions–

縦、横の指定や分割位置などが設定できるようでメソッド数も少なくシンプルなものです。

ただ、私の英語力及び Java 力では理解できないものがあり目から汗が出ています。

Example に sp.setDividerPositions(0.3f, 0.6f, 0.9f); とあるんだけど

最後の引数の 0.9f は無くてもいいんじゃないの?

最後のスペースは自動計算されるはずでは?

なぜなんだろう?

何か意味があるはずなんだろうけど・・・

と言うことでサクッとプログラムを組んで動作確認してみました。

上記のように ? の状態なのでこれであっているか自信はありません。

ラベルをみっつ均等に表示させ、左のラベルは全体の33パーセントより小さくさせない、右のラベルは全体の33パーセントより大きくさせないという制限も付加してみました。

このプログラムの実行結果は下図のようになります。

初期状態

1

左の Divider を右へドラッグして左のラベルを大ききします。

2

左の Divider を左へドラッグして左のラベルを小さくしようとしますが制限がかかっていて小さくなりません。

3

右の Divider を右へドラッグして中央のラベルを大きくします。

4

右の Divider 左へドラッグして右のラベルを大きくしようとしますが制限がかかっておおきくなりません。

5

これって以外と便利に使えるかもしれないですね。

なんで日本語の情報がないんだろう?

シンプルすぎてスルーされているんだろうか?

最後に、ラベルのテキストは私個人の好みであり所属する会社の公式な好みではありません。(ヲヒ

Hatena タグ:


TextField を 0 から 9 までの数値しか入力できないようにしてみた

JavaFX

このプログラムは TextField に入力制限をかけたいなぁって思ってどうすればいいんだろう?ってネットサーフィンしていたときに見つけたものです。

Java 8u40 では Formatted Text が追加されるらしいのですが、お試し版を使ったサンプルコードの紹介がまだ見当たらない現状なのでφ(..)メモメモ

ちなみに Alert Dialogs はみんな待っているのでサンプルコードはもう出ていますね。

あと、Spinner も追加されるようです。

JavaFX はまだまだ足りないものがあるとあちこちで言われていますが着実に進化しているようです。

それでは忘備録として下記コードを書き留めておきます。

このプログラムは TextField の lengthProperty にリスナーを登録して入力した値を判定して処理してます。

これだと何かしらのイベント発生時に TextField の入力値を取得して正規表現で判定して問題あればアラートダイアログ出して入力し直してもらうという方法より場合によってはいいかもしれません。

小ネタですがもう暫くは活躍してもらえそうです。(^_^)

Hatena タグ:

JavaFX の MeshView を試してみる その2

JavaFX

このエントリーは JavaFX の MeshView を試してみる の続きです。

今回は立方体を表示させるプログラムを組んでみます。

立方体だからといって複雑になり難しくなることはありません。

しょせん、最小構成のポリゴン(  TriangleMesh ) の集まりです。

立方体の頂点の座標は下図のようにしました。

box

 

この立方体に貼るテクスチャは次のものを使います。

duke_uv

 

これを先ほの立方体へ貼ります。

解りやすくするためにテクスチャの座標とインデックスをいれた画像を用意しました。

t_map

 

前回のエントリーをお読みになった方は下記のソースコードを見たら何をやっているか理解できるでしょう。

今回はちょっとピッキング API でお遊びをいれています。

ピッキング API で取得した情報を標準出力に表示させたり、

オブジェクトの拡大縮小をやっています。( この部分は JavaFX の標準機能だけでシンプルな 3D トイピアノをつくろう を参考にしてください。)

scene.setOnMouseClicked(event -> {
    PickResult pickResult = event.getPickResult();        
    System.out.println(“PickResult Node : ” + pickResult.getIntersectedNode());
    System.out.println(“PickResult Face : ” + pickResult.getIntersectedFace());
    System.out.println(“PickResult TexCoord : ” + pickResult.getIntersectedTexCoord());
    System.out.println(“PickResult Distance : ” + pickResult.getIntersectedDistance());          
    if (pickResult.getIntersectedNode() == meshBox) {
        Point3D point3d = pickResult.getIntersectedPoint();
        if (point3d.getX() != 0.0d && point3d.getY() != 0.0d && point3d.getZ() != 0.0d) {
            meshBox.setScaleX(abs(point3d.getX() / 100.0d) * 1.8d);
            meshBox.setScaleY(abs(point3d.getY() / 100.0d) * 1.8d);
            meshBox.setScaleZ(abs(point3d.getZ() / 100.0d) * 1.8d);
        } else {
            meshBox.setScaleX(0.5d);
            meshBox.setScaleY(0.5d);
            meshBox.setScaleZ(0.5d);
        }
    } else {
        meshBox.setScaleX(1.0d);
        meshBox.setScaleY(1.0d);
        meshBox.setScaleZ(1.0d);
    }
});

これによって得られる情報は下記のようになります。

PickResult Node : MeshView@7bc4dd1a
PickResult Face : 10
PickResult TexCoord : Point2D [x = 0.4647918545001403, y = 0.5826962887300013]
PickResult Distance : 675.187084447299

最後の PickResult Distance はカメラからの距離となります。

ついでに 3D オブジェクトの情報もとってみました。

System.out.println(“PointElementSize : ” + this.getPointElementSize());
System.out.println(“TexCoordElementSize : ” + this.getTexCoordElementSize());
System.out.println(“FaceElementSize : ” + this.getFaceElementSize());

プログラムの実行結果で得られた値は下記のようになります。

PointElementSize : 3
TexCoordElementSize : 2
FaceElementSize : 6

これらは上から 3, 2, 6 といつも同じ数値を返すようです。

私はてっきり各配列の要素数を返すものだと思い込んでいたので少しばかり悩んで時間を無駄にしてしまいました。

これらの存在意義が解らないので未だにすっきりしていないし、間違って解釈している可能性もあるので霧の中にいるような感覚が今もあります。

あと、今回は複数のフェイスで 3D オブジェクトが構築されているので次のメソッドを使用します。

javafx.scene.shape.TriangleMesh クラスの ObservableIntegerArray getFaceSmoothingGroups() メソッドです。

これを使いフェイスをグルーピングしてスムーズに表示させることが可能となるようです。

this.getFaceSmoothingGroups().addAll(
        0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5
);

上記コードは、triangle A-C-B と triangle C-D-B をグルーピング ( 0 )

triangle E-F-G と G-F-H ( 1 )、triangle A-B-E と triangle E-B-F ( 2 ) … という具合にグルーピングしていきます。

最終的にはフェイスの数と faceSmoothingGroups の配列の要素数は等しくなります。

これを間違えてもコンパイルエラーにはなりませんし、プログラムもエラーで止まることなく実行されてしまいます。

ただ肝心の 3D オブジェクトは表示されることは無いでしょう。

あっ、空だと表示されますね。(当たり前か)

さて、この機能なんですが本当に効果があるのでしょうか?

私の環境では違いを確認できませんでした。

このような小さなプログラムでは効果が確認できないのかもしれません。

最後にこのプログラムの動画を貼っておきますので興味のある方はご覧くださいませ。

 

JavaFX 楽しすぎるから年末の TODO が減らない! どうしよう(>_<。)

Hatena タグ:

« 古い記事 新しい記事 »