我是 JavaFX 的新手,目前正在尝试为学校项目执行日历应用程序。我想知道是否有办法连接fx:id
这样的
@FXML
private Label Box01;
(In function)
String ExampleNum = "01";
(Box+ExampleNum).setText("Test");
答案 0 :(得分:1)
各种可能的解决方案:
您可以使用reflection,但这样会很难看,我也不会建议。
通常,如果你有很多东西,你可以把它们放在像列表或数组这样的集合中。标签将是某个布局窗格的子项,因此您可以获取窗格的子项并按索引查找项目,如下所示:
((Label) parent.getChildren().get(0)).setText("Text");
如果已为标签分配了css ID,则可以使用该标签lookup标签。
例如,在您的FXML中定义:
<Label text="hello" fx:id="Box01" id="Box01"/>
然后您可以使用以下方式查找标签:
String boxNum = "01";
Label box = (Label) parent.lookup("#Box" + boxNum);
请参阅该项目的参考:
@FXML private Label box01;
box01.setText("Test");
除了:请根据standard Java conventions使用驼峰案例。
答案 1 :(得分:1)
除了@jewelsea提到的方法之外,还有两种方法可以做到这一点:
创建&amp;从fxml注入包含框的Map
:
<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxml.Controller">
<children>
<Label text="foo" fx:id="a"/>
<Label text="bar" fx:id="b"/>
<Spinner fx:id="number">
<valueFactory>
<SpinnerValueFactory.IntegerSpinnerValueFactory min="1" max="2"/>
</valueFactory>
</Spinner>
<Button text="modify" onAction="#modify"/>
<fx:define>
<HashMap fx:id="boxes">
<box1>
<fx:reference source="a"/>
</box1>
<box2>
<fx:reference source="b"/>
</box2>
</HashMap>
</fx:define>
</children>
</VBox>
<强>控制器强>
public class Controller {
private Map<String, Label> boxes;
@FXML
private Spinner<Integer> number;
@FXML
private Label box1;
@FXML
private Label box2;
@FXML
private void modify(ActionEvent event) {
boxes.get("box"+number.getValue()).setText("42");
}
}
将namespace
的{{1}} FXMLLoader
映射Map<String, Object>
传递给关联的fx:id
,并传递给控制器:
Object
<强>控制器强>
<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxml.Controller">
<children>
<Label text="foo" fx:id="box1"/>
<Label text="bar" fx:id="box2"/>
<Spinner fx:id="number">
<valueFactory>
<SpinnerValueFactory.IntegerSpinnerValueFactory min="1" max="2"/>
</valueFactory>
</Spinner>
<Button text="modify" onAction="#modify"/>
</children>
</VBox>
public class Controller implements NamespaceReceiver {
private Map<String, Object> namespace;
@FXML
private Spinner<Integer> number;
@FXML
private Label box1;
@FXML
private Label box2;
@FXML
private void modify(ActionEvent event) {
((Label)namespace.get("box" + number.getValue())).setText("42");
}
@Override
public void setNamespace(Map<String, Object> namespace) {
this.namespace = namespace;
}
}
加载fxml的代码:
public interface NamespaceReceiver {
public void setNamespace(Map<String, Object> namespace);
}