Spinner<Duration>
オブジェクトをFXML内に作成しようとしています。 SpinnerValueFactory<Duration>
を拡張するDurationSpinnerValueFactory
を作成しました。 DurationSpinnerValueFactory
のデフォルトのコンストラクタと、最大許容値をとるコンストラクタを定義しました。次のようにコンストラクタが定義されています。コンストラクタがjava.time.DurationになるカスタムJavaFXコンポーネント
import java.time.Duration;
...
public class DurationSpinnerValueFactory extends SpinnerValueFactory<Duration> {
public DurationSpinnerValueFactory() {
this(null);
}
public DurationSpinnerValueFactory(@NamedArg("max") final Duration max) {
...
}
}
FXMLの中で、次は、(デフォルトのコンストラクタを呼び出す)期待通りに働いている:
...
<?import myNamespace.DurationSpinnerValueFactory?>
...
<Spinner fx:id="mySpinner">
<valueFactory>
<DurationSpinnerValueFactory />
</valueFactory>
</Spinner>
...
しかし、私はmax
の値を追加しようとすると、プロパティを呼び出すと、呼び出されたコンストラクタが変更されるため、エラーが発生します。以下は、FXMLの変更を示しています
<DurationSpinnerValueFactory max="PT10M" />
私は取得していますエラーは次のとおりです。
javafx.fxml.LoadException:
unknown path:23
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2425)
...
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: java.lang.IllegalArgumentException: Unable to coerce PT10M to class java.time.Duration.
at com.sun.javafx.fxml.builder.ProxyBuilder.createObjectFromDefaultConstructor(ProxyBuilder.java:340)
at com.sun.javafx.fxml.builder.ProxyBuilder.build(ProxyBuilder.java:223)
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:763)
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2823)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2532)
... 18 more
Caused by: java.lang.IllegalArgumentException: Unable to coerce PT10M to class java.time.Duration.
at com.sun.javafx.fxml.BeanAdapter.coerce(BeanAdapter.java:496)
at com.sun.javafx.fxml.builder.ProxyBuilder$Setter.invoke(ProxyBuilder.java:533)
at com.sun.javafx.fxml.builder.ProxyBuilder.createObjectFromDefaultConstructor(ProxyBuilder.java:338)
... 22 more
私は内の値を解析し、その後、String
にコンストラクタでmax
の種類を変えることができることを知っていますコンストラクタしかし、私はmax
のタイプがDuration
でなければならないことを知っているので、これを避けることを好むでしょう。 FXMLLoader.load(...)
をFXML内のDuration
オブジェクトを解析できるようにする方法はありますか?
私が掲示したコードが与えられている例外は「* PT10Mをクラスjava.time.Duration *に強制することができません」です。したがって、 'FXMLLoader'は、文字列" PT10M "を' java.time.Duration'に強制しようとしています。これは、その形式の文字列を必要とします。 'java.time.Duration'を使用することができない場合は、あなたのソリューションを使用します。しかし、FXMLLoaderにFXML内のテキストからカスタムタイプを解析する方法を伝える方法があると思います。 –
はい、それは私がコミュニケートしようとしていたものです.FXMLLoaderソースの「Unable to coerce」メッセージが見つかります。あなたの完全な例を実行しようとはしませんでした。入力コードを少しだけ複製するのは難しいでしょう。他のエラーがあるかもしれません。 – jewelsea
あなたのソリューションはかなり良い回避策を提供します。私は単に、それぞれのコンストラクタのコンストラクタオーバーロードを追加しました。型 'java.time.Duration'を' javafx.util 'に置き換えました。'Duration'を呼び出し、' javafx.util.Duration'の値を 'java.time.Duration.ofSeconds((long)javafxDuration.toSeconds())'を使って変換することによって、他のコンストラクタに呼び出しを転送します。 –