2017-02-22 3 views
1

permet de dire que j'ai une classe de ressources comme ceci:JavaFX: Accès à FXML à un non-String-objet à partir d'un ResourceBundle

public class Resources extends java.util.ListResourceBundle { 

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

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

Dans ma classe d'application je charge le fxml comme ceci:

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

Dans mon foo.fxml Je veux utiliser à la fois ma chaîne et mon double valeur de ressources, comme ceci:

<Label text="%FOO"> 
<Polygon> 
    <points> 
     <Double fx:value="0"/> 
     <Double fx:value="0"/> 
     <Double fx:value="%BAR"/> 
     <Double fx:value="0"/> 
    </points> 
</Polygon> 

La première ligne fonctionne parfaitement, mais la ligne avec fx:value="%BAR" crée exception comme suit:

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 

Ma question est la suivante: comment utiliser les objets de ressources autres que String dans FXML?

Modifier: Vous avez toujours ce problème. J'ai même essayé {"BAR", new Double(123)} dans ma classe de ressources. La même erreur apparaît, ce qui est honnêtement logique car ce n'est rien qui corrige logiquement l'exception. J'y ai beaucoup réfléchi et je suis perdu ici parce que je veux vraiment que ça marche et que je ne sache pas quoi faire. Merci pour toute aide!

Répondre

0

Je posté cette question sur les forums Oracle Community et a obtenu une réponse: https://community.oracle.com/message/14270285#14270285

L'auteur se réfère à FXMLLoader source où vous pouvez voir que seul getString est invoqué par le FXMLLoader. Par conséquent, il n'est tout simplement pas possible de le faire comme je le voulais. L'auteur continue de décrire que je pourrais remplacer FXMLLoader mais la partie importante, la méthode resolvePrefixedValue, est privée en disant que c'est un «non-go».

En fin de compte, je laisse FXMLLoader comme il est et travaille avec une mise en œuvre InitializableController qui invoque la méthode getObject de ma classe Resources et ajoute les valeurs à Polygon dans la méthode initialize. Cela fonctionne bien pour moi, car la partie importante dans mon esprit est d'avoir les valeurs définies dans ma classe Resources.