我有自定义组件,标签很少,textField很少。我需要实例化它3次,但每个版本必须有所有标签前缀为不同的字符串。
我的组件片段fxml:
#!/bin/python
import csv
with open('data.csv', 'rt') as f:
reader = csv.reader(f, delimiter=',')
next(reader)# skip header
for row in reader:
with open(row[1]+".txt","a") as mov:
mov.write(row[0]+" -- "+row[1]+" ("+row[2]+")\n")
我想实现某种代码占位符,如:
<Label text="inclusions type:"/>
<Label text="inclusions size:" GridPane.rowIndex="1"/>
<Label text="inclusions number:" GridPane.rowIndex="2"/>
我尽量避免逐个注入所有标签,因为我知道没有可能将所有标签一次性注入控制器,如ex。 <Label text="$variable inclusions type:"/>
<Label text="$variable size:" GridPane.rowIndex="1"/>
<Label text="$variable number:" GridPane.rowIndex="2"/>
问题:如何将String从控制器代码传递到fxml视图,避免重复和不必要的工作?
答案 0 :(得分:2)
您可以在FXML中使用binding expression从FXML名称空间中获取变量值。
在以下示例中,我们成功注入名称“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);
}
}