JavaFX:在 FXML 中访问 ResourceBundle 中的非字符串对象
JavaFX: Access in FXML to a non-String-Object from a ResourceBundle
假设我有这样的资源 class:
public class Resources extends java.util.ListResourceBundle {
private static final Object[][] OBJECTS = new Object[][]{
{"FOO", "foo"},
{"BAR", 123d}
}
@Override
protected Object[][] getContents() {
return OBJECTS;
}
}
在我的应用程序 class 中,我像这样加载 fxml
:
Resources resources = new Resources();
FXMLLoader loader = new FXMLLoader(getClass().getResource("/foo.fxml"), resources);
Parent root = loader.load();
在我的 foo.fxml
中,我想同时使用我的字符串和我的双资源值,如下所示:
<Label text="%FOO">
<Polygon>
<points>
<Double fx:value="0"/>
<Double fx:value="0"/>
<Double fx:value="%BAR"/>
<Double fx:value="0"/>
</points>
</Polygon>
第一行完美运行,但带有 fx:value="%BAR"
的行创建异常如下:
javafx.fxml.LoadException:
file:/foo.fxml:90
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.access00(FXMLLoader.java:103)
at javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1143)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at my Application class in line Parent root = loader.load();
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(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$null8(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NumberFormatException: For input string: "%BAR"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at java.lang.Double.valueOf(Double.java:502)
at com.sun.javafx.fxml.BeanAdapter.coerce(BeanAdapter.java:450)
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.constructValue(FXMLLoader.java:982)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
... 17 more
所以我的问题是:如何在 FXML 中使用 String
以外的资源对象?
编辑: 仍然遇到这个问题。我什至在我的资源 class 中尝试了 {"BAR", new Double(123)}
。出现同样的错误,老实说这是有道理的,因为这在逻辑上无法修复异常。我想了很多,但我很迷茫,因为我真的希望它能起作用,但不知道该怎么做。感谢您的帮助!
所以我在 Oracle 社区论坛上发布了这个问题并得到了答案:https://community.oracle.com/message/14270285#14270285
作者提到了 FXMLLoader source,您可以在其中看到 FXMLLoader
仅调用了 getString
。因此,根本不可能按照我想要的方式执行此操作。作者继续描述我可以覆盖 FXMLLoader
但重要的部分 resolvePrefixedValue
方法是私有的,说它是 'no-go'.
最后,我将保持 FXMLLoader
不变,并使用 Initializable
实现 Controller
,它从我的 Resources
调用 getObject
方法class 并将值添加到 initialize
方法中的 Polygon
。这对我来说很好用,因为我心中的重要部分是在 Resources
class.
中定义值
假设我有这样的资源 class:
public class Resources extends java.util.ListResourceBundle {
private static final Object[][] OBJECTS = new Object[][]{
{"FOO", "foo"},
{"BAR", 123d}
}
@Override
protected Object[][] getContents() {
return OBJECTS;
}
}
在我的应用程序 class 中,我像这样加载 fxml
:
Resources resources = new Resources();
FXMLLoader loader = new FXMLLoader(getClass().getResource("/foo.fxml"), resources);
Parent root = loader.load();
在我的 foo.fxml
中,我想同时使用我的字符串和我的双资源值,如下所示:
<Label text="%FOO">
<Polygon>
<points>
<Double fx:value="0"/>
<Double fx:value="0"/>
<Double fx:value="%BAR"/>
<Double fx:value="0"/>
</points>
</Polygon>
第一行完美运行,但带有 fx:value="%BAR"
的行创建异常如下:
javafx.fxml.LoadException:
file:/foo.fxml:90
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.access00(FXMLLoader.java:103)
at javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1143)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at my Application class in line Parent root = loader.load();
at com.sun.javafx.application.PlatformImpl.lambda$null3(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater4(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$null8(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NumberFormatException: For input string: "%BAR"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at java.lang.Double.valueOf(Double.java:502)
at com.sun.javafx.fxml.BeanAdapter.coerce(BeanAdapter.java:450)
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.constructValue(FXMLLoader.java:982)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
... 17 more
所以我的问题是:如何在 FXML 中使用 String
以外的资源对象?
编辑: 仍然遇到这个问题。我什至在我的资源 class 中尝试了 {"BAR", new Double(123)}
。出现同样的错误,老实说这是有道理的,因为这在逻辑上无法修复异常。我想了很多,但我很迷茫,因为我真的希望它能起作用,但不知道该怎么做。感谢您的帮助!
所以我在 Oracle 社区论坛上发布了这个问题并得到了答案:https://community.oracle.com/message/14270285#14270285
作者提到了 FXMLLoader source,您可以在其中看到 FXMLLoader
仅调用了 getString
。因此,根本不可能按照我想要的方式执行此操作。作者继续描述我可以覆盖 FXMLLoader
但重要的部分 resolvePrefixedValue
方法是私有的,说它是 'no-go'.
最后,我将保持 FXMLLoader
不变,并使用 Initializable
实现 Controller
,它从我的 Resources
调用 getObject
方法class 并将值添加到 initialize
方法中的 Polygon
。这对我来说很好用,因为我心中的重要部分是在 Resources
class.