2016-12-30 22 views
1

我還挺新的JavaFX目前正在嘗試爲學校項目做一個Calendar應用程序。我在想,如果有來連接一個fx:id這樣的連接Javafx fx:Id

@FXML 
private Label Box01; 
(In function) 
String ExampleNum = "01"; 
(Box+ExampleNum).setText("Test"); 

回答

1

除了由@jewelsea提到的方法這裏有2種方法可以做到這一點:

  1. 創建&注入含有箱子從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"); 
        } 
    
    } 
    
  2. 傳遞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; 
    } 
    
1

各種可能的解決辦法:

  1. 你可以使用reflection,但是這將是醜陋,我不會建議它。

  2. 通常情況下,如果你有很多東西,你可以把它們放在一個列表或數組中。該標籤會出現一些佈局窗格中的孩子,這樣你就可以得到窗格中的孩子們,並通過指數的東西,如查找的項目:如果標籤已被分配一個CSS的id,那麼你可以

    ((Label) parent.getChildren().get(0)).setText("Text"); 
    
  3. 使用它來lookup標籤。

    例如,在你的FXML定義:

    String boxNum = "01"; 
    Label box = (Label) parent.lookup("#Box" + boxNum); 
    
  4. 只是指該項目由它的參考:

    @FXML private Label box01; 
    box01.setText("Test"); 
    
  5. <Label text="hello" fx:id="Box01" id="Box01"/> 
    

    然後你可以使用查找標籤

Aside:請按照standard Java conventions使用駱駝案例。

+0

注:如果指定'FX:id',但沒有'id'的'FX:id'作爲'id',這使得在'ID = 「Box01的」' fxml代碼冗餘... – fabian