连接Javafx fx:Id

时间:2016-12-30 05:36:03

标签: javafx concatenation

我是 JavaFX 的新手,目前正在尝试为学校项目执行日历应用程序。我想知道是否有办法连接fx:id这样的

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

2 个答案:

答案 0 :(得分:1)

各种可能的解决方案:

  1. 您可以使用reflection,但这样会很难看,我也不会建议。

  2. 通常,如果你有很多东西,你可以把它们放在像列表或数组这样的集合中。标签将是某个布局窗格的子项,因此您可以获取窗格的子项并按索引查找项目,如下所示:

    ((Label) parent.getChildren().get(0)).setText("Text");
    
  3. 如果已为标签分配了css ID,则可以使用该标签lookup标签。

    例如,在您的FXML中定义:

    <Label text="hello" fx:id="Box01" id="Box01"/>
    

    然后您可以使用以下方式查找标签:

    String boxNum = "01";
    Label box = (Label) parent.lookup("#Box" + boxNum);
    
  4. 请参阅该项目的参考:

    @FXML private Label box01; 
    box01.setText("Test");
    
  5. 除了:请根据standard Java conventions使用驼峰案例。

答案 1 :(得分:1)

除了@jewelsea提到的方法之外,还有两种方法可以做到这一点:

  1. 创建&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");
        }
    
    }
    
  2. 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);
    }