Java 如何将变量从控制器代码传递到fxml视图?

Java 如何将变量从控制器代码传递到fxml视图?,java,javafx,javafx-2,javafx-8,gluon,Java,Javafx,Javafx 2,Javafx 8,Gluon,我有一些标签和文本字段的自定义组件。我需要实例化它3次,但每个版本都必须有不同字符串前缀的所有标签 我的组件fxml的片段: <Label text="inclusions type:"/> <Label text="inclusions size:" GridPane.rowIndex="1"/> <Label text="inclusions number:" GridPane.rowIndex="2"/> 我想实现某种代码占位符,如: <La

我有一些标签和文本字段的自定义组件。我需要实例化它3次,但每个版本都必须有不同字符串前缀的所有标签

我的组件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"/>

我尽量避免逐个注入所有标签,因为我知道不可能一次将所有标签注入控制器,比如ex.
Collection allLabels

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

您可以在fxml中使用a从fxml命名空间中获取变量值

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

fxml文件


若你们想动态地添加组件,你们应该用java代码实例化并将它们添加到场景中!Fxml用于手动定义静态组件。在Fxml文件中包含动态组件是没有意义的。我理解,但是将.Fxml文件和“Swing样式”代码放在一起对我不好。但我有点迂腐:我想我误解了。如果您想注入标签文本的一部分,而不是许多标签带有一些可变文本,这是有意义的!我尝试了这个,但我并没有找到单引号,FxmlLoader向我抛出了异常。谢谢看起来场景生成器(来自Oracle和Gluon)不支持连接。是的,这是Gluon必须解决的问题。我不知道你会怎么做。奇怪的是,他们的支持页面链接回到了StackOverflow,而我在他们的支持页面中没有看到问题跟踪链接。也许如果你只是把问题贴上胶子或者其他什么东西,他们可能会调查它。Gluon也提供商业支持,并且在他们的页面上有一个请求链接,所以这是一个可能的途径。Intellij也无法正确解析表达式。因此,特性请求也可以针对Intellij提出。
<?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>
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);
    }
}