Java SE8u40でのJavaFXの改善

前へ12 3 4 Page3次へ 3/4ページ

リスト5では、java.util.Pairクラスを使用して、検索テキストとブールの大文字と小文字を区別する検索値の2つの項目を便利に格納しています。ダイアログの検索テキストフィールドと大文字と小文字を区別する検索チェックボックスの値をPaircall()メソッドから返されるオブジェクトに変換するために、結果コンバーターがインストールされています。この変換は、Searchボタンがクリックされたときにのみ発生します。Cancelクリックしても発生しません。

search.pngをお探しですか?

リスト5はsearch.png、この記事のコードアーカイブに含まれている外部画像ファイルに依存しています。

リスト5を次のようにコンパイルします。

javac SearchDialog.java

結果のアプリケーションを次のように実行します。

java SearchDialog

図18は、結果のダイアログを示しています。

図18:検索ダイアログのデフォルトは検索テキストなしで大文字と小文字を区別しない検索

JavaFXテキストフィールドに入力してチェックボックスをオンにするとします。をクリックするSearchと、標準出力ストリームで次の出力が表示されます。

Search text = JavaFX, Case-sensitive search = true

Q: JavaFXの標準ダイアログとカスタムダイアログのサポートについて詳しく教えてください。

A:追加の標準およびカスタムダイアログの例(カスタムログインダイアログを含む)については、JavaFXダイアログを確認し、ダイアログのスタイル設定とダイアログの所有者およびモダリティの設定について学習してください。

スピナーコントロール

Q:スピナーとは何ですか?

Aのスピナーは、ユーザがこのような値の順序付けられたシーケンスから数またはオブジェクトを選択できる単一行テキストフィールド制御です。スピナーは通常、シーケンスの要素をステップスルーするための1対の小さな矢印ボタンを提供します。キーボードのup arrow/down arrowキーも要素を循環します。ユーザーは、(正当な)値をスピナーに直接入力することもできます。コンボボックスは同様の機能を提供しますが、重要なデータを隠す可能性のあるドロップダウンリストを必要とせず、最大値から最小値に折り返すなどの機能を使用できるため、スピナーが好まれる場合があります(例:最大の正の整数から0まで)。

Q:スピナーはどのように実装されますか?

A:スピナーはjavafx.scene.control.Spinnerコントロールクラスのインスタンスとして実装されています。このクラスは、抽象javafx.scene.control.SpinnerValueFactoryクラスに依存して、コントロールのモデル(特定のタイプのユーザーが選択可能な値の範囲)を提供します。現在、唯一サポートされているモデルは、そのネストされたことで定義されDoubleSpinnerValueFactoryIntegerSpinnerValueFactoryおよびListSpinnerValueFactoryクラス。

Q:スピナーを作成するにはどうすればよいですか?

A:Spinnerのコンストラクターの1つを呼び出すことにより、スピナーを作成します。たとえば、Spinner(int min, int max, int initialValue)からまでの整数値の1つを選択するためのスピナーを作成minmaxます。最初に選択された値は、で識別されinitialValueます。この値がmin/のmax範囲内にない場合、の値がmin最初に選択された値になります。

Spinner(int min, int max, int initialValue)は、IntegerSpinnerValueFactoryこれらの値をモデルとして使用してクラスのインスタンスをインストールする便利なコンストラクターです。を直接操作するIntegerSpinnerValueFactory場合は、このクラスをインスタンス化して、その参照をSpinner(SpinnerValueFactory valueFactory)コンストラクターに渡すことができます。または、Spinner()コンストラクターを使用して空のスピナーを作成し、Spinnervoid setValueFactory(SpinnerValueFactory value)メソッドを呼び出してこのファクトリオブジェクトをインストールすることもできます。

Q:整数および倍精度浮動小数点スピナーの簡単な例を教えてください。

A:リスト6を確認してください。

リスト6. SpinnerDemo.java(バージョン1)

import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Spinner; import javafx.scene.layout.GridPane; import javafx.stage.Stage; public class SpinnerDemo extends Application { @Override public void start(Stage primaryStage) { Spinner ispinner = new Spinner(1, 10, 2); Spinner dspinner = new Spinner(1.5, 3.5, 1.5, 0.5); GridPane grid = new GridPane(); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(10)); grid.add(new Label("Integer Spinner"), 0, 0); grid.add(ispinner, 1, 0); grid.add(new Label("Double Spinner"), 0, 1); grid.add(dspinner, 1, 1); Scene scene = new Scene(grid, 350, 100); primaryStage.setTitle("SpinnerDemo"); primaryStage.setScene(scene); primaryStage.show(); } }

リスト6のstart()メソッドは、最初に前述のコンストラクターを介して整数スピナーを作成します。次に、Spinner(double min, double max, double initialValue, double amountToStepBy)コンストラクターを介して倍精度浮動小数点スピナーを作成します。このコンストラクターは、に渡された値を介してスピナーをインクリメントまたはデクリメントする単位を受け取りamountToStepByます0.5。これはたまたまです。

続行して、start()グリッドペインコンテナを作成および構成し、2行2列のグリッドにこれらのスピナーと関連するラベルを入力します。次に、グリッドに基づいてシーンを作成し、ステージを構成/表示します。

リスト6を次のようにコンパイルします。

javac SpinnerDemo.java

結果のアプリケーションを次のように実行します。

java SpinnerDemo

図19は、結果のユーザーインターフェイスを示しています。

図19:各スピナーの矢印をクリックして、値の範囲をインクリメント/デクリメントします

Q:以前のスピナーを編集可能にしたいのですが。このタスクを実行するにはどうすればよいですか?

A:コールSpinnervoid setEditable(boolean value)方法、合格truevalueSpinnerDemoデモンストレーション用にの2番目のバージョンを作成しました。ソースコードについては、この記事のコードアーカイブを参照してください。

Q:以前のスピナーを編集可能にし、テキストフィールドに不正な文字(文字など)を入力してEnterキーを押すと、例外がスローされます。例外はjava.lang.NumberFormatException、整数ベースのスピナーとjava.lang.RuntimeException(ラッピングjava.text.ParseException)倍精度浮動小数点スピナーの場合です。この例外がスローされないようにするにはどうすればよいですか?

A:抽象javafx.util.StringConverterクラスのサブクラス(ここTで、は変換される型または変換される型String)のインスタンスをコンバーターとしてインストールすることにより、この例外がスローされるのを防ぐことができますSpinnerValueFactory。このオブジェクトは、スローされた例外をキャッチしてアクションを実行します。

Spinner使用するjavafx.scene.control.TextFieldユーザ入力を得るためのエディタとしてオブジェクト。テキストフィールドには任意の文字を格納できるため、数値コンテキストの文字などの不適切な文字を入力できます。ユーザーがを押すEnterと、入力はSpinnerValueFactoryコンバーターのT fromString(String string)メソッドに渡されます。整数または倍精度浮動小数点ファクトリの場合、TIntegerまたはDoubleです。不正な文字を含む文字列から数値に変換すると、から例外がスローされfromString()ます。現在のコンバーターへの参照を取得し、そのfromString()メソッドが適切なブロックを含むステートメントで他のコンバーターのfromString()メソッドを呼び出す新しいコンバーターをインストールします。リスト7は、このタスクを実行するアプリケーションを示しています。trycatch

リスト7. SpinnerDemo.java(バージョン3)

import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Spinner; import javafx.scene.layout.GridPane; import javafx.stage.Stage; import javafx.util.StringConverter; public class SpinnerDemo extends Application { @Override public void start(Stage primaryStage) { Spinner ispinner = new Spinner(1, 10, 2); ispinner.setEditable(true); StringConverter sci = ispinner.getValueFactory().getConverter(); StringConverter sci2 = new StringConverter() { @Override public Integer fromString(String value) { try { return sci.fromString(value); } catch (NumberFormatException nfe) { System.out.println("Bad integer: " + value); return 0; } } @Override public String toString(Integer value) { return sci.toString(value); } }; ispinner.getValueFactory().setConverter(sci2); Spinner dspinner = new Spinner(1.5, 3.5, 1.5, 0.5); dspinner.setEditable(true); StringConverter scd = dspinner.getValueFactory().getConverter(); StringConverter scd2 = new StringConverter() { @Override public Double fromString(String value) { try { return scd.fromString(value); } catch (RuntimeException re) { System.out.println("Bad double: " + value); System.out.println("Cause: " + re.getCause()); return 0.0; } } @Override public String toString(Double value) { return scd.toString(value); } }; dspinner.getValueFactory().setConverter(scd2); GridPane grid = new GridPane(); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(10)); grid.add(new Label("Integer Spinner"), 0, 0); grid.add(ispinner, 1, 0); grid.add(new Label("Double Spinner"), 0, 1); grid.add(dspinner, 1, 1); Scene scene = new Scene(grid, 350, 100); primaryStage.setTitle("SpinnerDemo"); primaryStage.setScene(scene); primaryStage.show(); } }

リスト7(javac SpinnerDemo.java)をコンパイルし、結果のアプリケーション(java SpinnerDemo)を実行します。スピナーのテキストフィールドに不正な文字を入力すると、以下に示すようなエラーメッセージが表示されます。

Bad integer: a2 Bad double: b1.5 Cause: java.text.ParseException: Unparseable number: "b1.5"

Q:文字列ベースのスピナーが必要です。どうすれば入手できますか?

A:Spinner(ObservableList items)コンストラクターを介して文字列ベースのスピナーを取得できます。たとえば、次のコードフラグメントは、平日の名前を選択するためのスピナーを作成する方法を示しています。

List weekDays = Arrays.asList("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"); ObservableList obsWeekDays = FXCollections.observableList(weekDays); Spinner sspinner = new Spinner(obsWeekDays);

このコードフラグメントをSpinnerDemoアプリケーションの4番目のバージョンから抜粋しました(ソースコードについては、この記事のコードアーカイブを参照してください)。そのアプリケーションを実行すると、図20に示すスピナーが表示されます。

Figure 20: Attempting to enter text into the editor that doesn't exactly match one of the weekday names results in java.lang.UnsupportedOperationException being thrown

Q: Can you provide me with more information about JavaFX's support for spinners?

A: Check out the JavaFX 8 documentation on Spinner and SpinnerValueFactory for more information about this control and its model. Also, you might want to run a Google search to find out how others are using this control.

Text formatting

Q: How does JavaFX support text formatting?

A: JavaFX supports text formatting by providing the javafx.scene.control.TextFormatter class with its nested Change class. Furthermore, the abstract javafx.scene.control.TextInputControl class (the parent class of TextField and javafx.scene.control.TextArea) has been given a textFormatter property so that any subclass automatically supports text formatting.

Q: What kinds of text formatting are supported?

A:TextFormatter supports two kinds of text formatting: value and change. A value formatter is called when you press the Enter key after entering the text. A change formatter is called for every text-deletion, text-addition, and text-replacement change for the focused text-input control. These formatters can be used separately or together.

Q: How are value and change formatters specified?