2016-12-02 32 views
1

我有几个标签和几个textFields的自定义组件。我需要实例化它3次,但每个版本都必须具有以不同字符串作为前缀的所有标签。如何将变量从控制器代码传递给fxml视图?

片段我的组件FXML的:

<Label text="inclusions type:"/> 
<Label text="inclusions size:" GridPane.rowIndex="1"/> 
<Label text="inclusions number:" GridPane.rowIndex="2"/> 

我想实现某种代码占位符,如:

<Label text="$variable inclusions type:"/> 
<Label text="$variable size:" GridPane.rowIndex="1"/> 
<Label text="$variable number:" GridPane.rowIndex="2"/> 

我会尽量避免注射的所有标签一个接一个,因为我知道没有可能一次将所有标签注入控制器,如前。 Collection<Label> allLabels;

问题:如何将字符串从控制器代码传递到fxml视图,避免重复和不必要的工作?

+1

如果要动态地添加组件,您应该实例,并将其在Java代码中添加场景! Fxml用于手动定义静态组件。在Fxml文件中使用动态组件毫无意义。 – Omid

+0

我明白,但将.fxml文件和“Swing style”代码放在一起对我来说并不好。但我有些迂腐:D –

+1

我想我误解了。如果你想注入标签的文本的一部分,而不是许多带有一些可变文本的标签,这是有道理的! – Omid

回答

2

您可以在FXML中使用binding expression从FXML名称空间中获取变量值。

在下面的例子中,我们成功地注入名称“Foobar”。

foobar

inclusions.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.VBox?> 

<VBox spacing="10" xmlns:fx="http://javafx.com/fxml"> 
    <Label text="${name + ' inclusions type'}"/> 
    <Label text="${name + ' inclusions size'}"/> 
    <Label text="${name + ' inclusions number'}"/> 
</VBox> 

NamespaceAware.java

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 

public class NamespaceAware extends Application { 
    @Override 
    public void start(final Stage stage) throws Exception { 
     FXMLLoader loader = new FXMLLoader(); 
     loader.getNamespace().put("name", "Foobar"); 
     loader.setLocation(getClass().getResource("inclusions.fxml")); 
     Pane content = loader.load(); 

     content.setPadding(new Insets(10)); 

     stage.setScene(new Scene(content)); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

我试过这个,但我没有弄清楚单引号,FxmlLoader向我抛出异常。谢谢!!! –

+0

看来场景构建器(都来自Oracle和Gluon)不支持连接。 –

+1

是的,这是你必须采取与胶粘剂。我不知道你会怎么做。奇怪的是,他们的支持页面链接到StackOverflow,我没有看到他们的支持页面中的问题跟踪链接。也许如果你只是标记了胶子的问题或者他们可能会研究的问题。胶子也提供商业支持,并在他们的网页上有一个链接要求,这是一条可能的路线。 Intellij想法检查也不能正确解析表达式。因此,功能请求也可以针对Intellij提出。 – jewelsea

相关问题