Java 如何将变量从控制器代码传递到fxml视图?
我有一些标签和文本字段的自定义组件。我需要实例化它3次,但每个版本都必须有不同字符串前缀的所有标签 我的组件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
<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);
}
}