FXML 模板或在 javafx 中生成占位符的方法
FXML template or a way to generate placeholders in javafx
我正在 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 查询的信息部署到 "template" 中的占位符中。任何帮助都适用于如何解决这个问题
您可以使用 custom component FXML pattern (also see 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>
然后定义一个controller/component class:
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...)。
我正在 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 查询的信息部署到 "template" 中的占位符中。任何帮助都适用于如何解决这个问题
您可以使用 custom component FXML pattern (also see 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>
然后定义一个controller/component class:
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...)。