【问题标题】:FXML template or a way to generate placeholders in javafxFXML 模板或在 javafx 中生成占位符的方法
【发布时间】:2018-10-29 21:09:57
【问题描述】:

我正在用 Java 制作一个 GUI,通过 SPARQL 查询获取我需要的数据。该程序是关于练习的,我想为每个练习制作一个包含相关信息的容器(hbox/vbox)。问题是现在,程序看起来真的很丑,因为我正在使用纯 javafx 生成 hbox,代码如下:

ResultSet result = Querying.ontologyQuery(Strings.getFeatured());
    List<Resource> exerciseList = new ArrayList<>();
    List<Resource> mainMuscleList = new ArrayList<>();
    List<Literal> equipmentList = new ArrayList<>();
    while (result.hasNext()) {
        QuerySolution qs = result.next();
        Resource exercise = qs.getResource("Exercise");
        Resource mainMuscle = qs.getResource("mainMuscle");
        Literal equipment = qs.getLiteral("Equipment");
        exerciseList.add(exercise);
        mainMuscleList.add(mainMuscle);
        equipmentList.add(equipment);
    }

    for (int i = 0; i < 4; i++) {
        HBox hbox = addHbox();
        vbox.getChildren().add(hbox);
        Label exercise = new Label();
        Label mainMuscle = new Label();
        Label equipment = new Label();

        mainMuscle.setText(mainMuscleList.get(i).getLocalName());
        equipment.setText(equipmentList.get(i).getString());
        exercise.setText(exerciseList.get(i).getLocalName());

        hbox.getChildren().add(exercise);
        hbox.getChildren().add(mainMuscle);
        hbox.getChildren().add(equipment);

我猜我在问什么,是否可以在 fxml 中制作一个模板,然后将来自 SPARQL 查询的信息部署到“模板”中的占位符中。任何帮助都可以解决这个问题

【问题讨论】:

    标签: java user-interface javafx fxml


    【解决方案1】:

    您可以使用custom component FXML pattern(另请参阅this question)。

    基本上是可以的

    <?xml ... ?>
    <?import javafx.scene.layout.HBox ?>
    <?import javafx.scene.control.Label ?>
    
    <fx:root type="HBox">
        <Label fx:id="exerciseLabel"/>
        <Label fx:id="mainMuscleLabel"/>
        <Label fx:id="equipmentLabel"/>
    </fx:root>
    

    然后定义一个控制器/组件类:

    public class ExerciseView extends HBox {
    
        @FXML
        private Label exerciseLabel ;
        @FXML
        private Label mainMuscleLabel ;
        @FXML
        private Label equipmentLabel ;
    
        public ExerciseView(Resource exercise, Resource mainMuscle, Literal equipment) {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("Exercise.fxml"));
            loader.setController(this);
            loader.setRoot(this);
            try {
                loader.load();
                mainMuscleLabel.setText(mainMuscle.getLocalName());
                equipmentLabel.setText(equipment.getString());
                exerciseLabel.setText(exercise.getLocalName());
            } catch (IOException exc) {
                throw new RuntimeException(exc);
            }
        }
    
        // ...
    }
    

    当然还有:

    ResultSet result = Querying.ontologyQuery(Strings.getFeatured());
    while (result.hasNext()) {
        QuerySolution qs = result.next();
        Resource exercise = qs.getResource("Exercise");
        Resource mainMuscle = qs.getResource("mainMuscle");
        Literal equipment = qs.getLiteral("Equipment");
        vbox.getChildren().add(new ExerciseView(exercise, mainMuscle, equipment));
    }
    

    (或者一些简单的修改,如果你不想让你的数据库代码知道你的 UI...)。

    【讨论】:

    • 优秀。谢谢
    猜你喜欢
    • 2017-05-20
    • 2012-02-17
    • 2017-02-04
    • 2015-05-10
    • 2015-05-20
    • 1970-01-01
    • 2019-12-26
    • 2020-09-20
    • 1970-01-01
    相关资源
    最近更新 更多