有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JavaFX:在FXML中从ResourceBundle访问非string对象

假设我有这样一个资源类:

public class Resources extends java.util.ListResourceBundle {

    private static final Object[][] OBJECTS = new Object[][]{
        {"FOO", "foo"},
        {"BAR", 123d}
    }

    @Override
    protected Object[][] getContents() {
        return OBJECTS;
    }
}

在我的应用程序类中,我加载fxml如下所示:

Resources resources = new Resources();
FXMLLoader loader = new FXMLLoader(getClass().getResource("/foo.fxml"), resources);
Parent root = loader.load();

在myfoo.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.access$2700(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$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.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之外的资源对象

编辑:仍存在此问题。我甚至在我的资源类中尝试了{"BAR", new Double(123)}。同样的错误也出现了,这确实是有道理的,因为从逻辑上来说,这并不能修复异常。我想了很多,我在这里很迷茫,因为我真的很想让它发挥作用,却不知道该怎么办。谢谢你的帮助


共 (1) 个答案

  1. # 1 楼答案

    所以我在Oracle社区论坛上发布了这个问题,并得到了答案:https://community.oracle.com/message/14270285#14270285

    作者引用了FXMLLoader source,您可以看到FXMLLoader只调用了getString。因此,以我想要的方式做这件事根本是不可能的。作者继续描述我可以重写FXMLLoader,但是重要的部分resolvePrefixedValue方法是私有的,表示它是“不可能的”

    最后,我将保持FXMLLoader不变,并使用一个Initializable实现Controller,它从我的Resources类调用getObject方法,并将值添加到initialize方法中的Polygon。这对我来说很好,因为我考虑的重要部分是在我的Resources类中定义值