我還挺新的JavaFX目前正在嘗試爲學校項目做一個Calendar應用程序。我在想,如果有來連接一個fx:id
這樣的連接Javafx fx:Id
@FXML
private Label Box01;
(In function)
String ExampleNum = "01";
(Box+ExampleNum).setText("Test");
我還挺新的JavaFX目前正在嘗試爲學校項目做一個Calendar應用程序。我在想,如果有來連接一個fx:id
這樣的連接Javafx fx:Id
@FXML
private Label Box01;
(In function)
String ExampleNum = "01";
(Box+ExampleNum).setText("Test");
除了由@jewelsea提到的方法這裏有2種方法可以做到這一點:
創建&注入含有箱子從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");
}
}
傳遞FXMLLoader
,這是一個Map<String, Object>
映射fx:id
s到相關聯的Object
S的namespace
,到控制器:
<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;
}
}
public interface NamespaceReceiver {
public void setNamespace(Map<String, Object> namespace);
}
代碼用於加載fxml:
public static <T> T load(URL url) throws IOException {
FXMLLoader loader = new FXMLLoader(url);
T result = loader.load();
Object controller = loader.getController();
if (controller instanceof NamespaceReceiver) {
((NamespaceReceiver) controller).setNamespace(loader.getNamespace());
}
return result;
}
各種可能的解決辦法:
你可以使用reflection,但是這將是醜陋,我不會建議它。
通常情況下,如果你有很多東西,你可以把它們放在一個列表或數組中。該標籤會出現一些佈局窗格中的孩子,這樣你就可以得到窗格中的孩子們,並通過指數的東西,如查找的項目:如果標籤已被分配一個CSS的id,那麼你可以
((Label) parent.getChildren().get(0)).setText("Text");
使用它來lookup標籤。
例如,在你的FXML定義:
String boxNum = "01";
Label box = (Label) parent.lookup("#Box" + boxNum);
只是指該項目由它的參考:
@FXML private Label box01;
box01.setText("Test");
<Label text="hello" fx:id="Box01" id="Box01"/>
然後你可以使用查找標籤
Aside:請按照standard Java conventions使用駱駝案例。
注:如果指定'FX:id',但沒有'id'的'FX:id'作爲'id',這使得在'ID = 「Box01的」' fxml代碼冗餘... – fabian