以前、ImageJ のプログラムを作っていて、GenericDaialog で設置できる Slider からは、整数値しか取得できないとこちらの記事に書いたことがありました。
しかし、API リファレンスを見ると addSlider メソッドでは、double 変数を引数として取ることができるとあります。
imagej.net ということは、小数も取得できるはずですが....
結局色々試してわかったことは、プレビューで使おうとすると整数値しか取得できないが、プレビューで使わなければ小数値も取得できるという仕様になっているということです。
例えば 0.0 ~ 1.0 の範囲で値を取得する、以下のようなスライダーを設置したいとします。
今、GenericDialog のオブジェクト名が gd だとすると、このようなスライダーを設置するには次のようなコードを書きます。
このコードは、最小値 0.0 最大値 1.0 デフォルト設定値 0.5 値の刻み 0.01 でスライダーを設置する、という意味です。
このスライダーから、実際に値を取得するときは、以下のようなコードを使いますが...
この場合、スライダーで設定した通りの値 (例えば 0.6 など) が取得できます。
ところが、プレビュー用に AdjustmentListener を使ってこのスライダーから値を取得しようとすると、整数値でしか値を取得することができません。例えば、このスライダー名を slider としますと、AdjustmentListener を引数として取ったプレビューアー用 class の中で、次のようなコードでプレビュー用にスライダーから値を取得することになります。
この時、プレビューアーの中で slider を使おうとすると、javax.swing.JSlider オブジェクトとして扱うことになります。従って、Java の API リファレンスによりますと、この時 getValue() メソッドでは整数値としてしか値を取得できないことになります。
docs.oracle.com そこで、てっきり、getValue() メソッドでは整数値としてしか値を取得できないなら、プレビューを使う場合、スライダーに指定できる値も整数しかダメだと思っていました。とはいえ、ダメもとで小数値を指定してみると、次のような動作になることが分かりました。
結局、どのような整数値を取得できるかというと、最大値を 刻み値で割った値になります。上の例では 0.0 ~ 1.0 を 0.01 の刻み値でスライダーを設置しますので、それを 0.01 で割った 0 ~ 100 で値を取得することになります。例えば、今スライダー上の値が 0.5 なら JSlider の getValue メソッドで取得できる値は 50 になる、ということです。もし、刻み値が 0.05 なら 0 ~ 20 の範囲で値を取得することになり、0.5 は 10 になります。
結局スライダーに小数値を指定しても、getValue() メソッドでは整数に換算して取得される、ということでした。
これは、同じオブジェクトでも、プレビューアーの中では Java のオブジェクトとして扱わなければならないが、その外では ImageJ のオブジェクトとして扱えるという差からこのような問題が発生するためで、プレビューで取得した値は適宜換算を行うことで、小数を扱うことができるということが分かりました。