Шаблон FXML или способ создания заполнителей в javafx - PullRequest
0 голосов
/ 19 мая 2018

Я делаю GUI на Java, где я получаю необходимые данные через SPARQL-запросы.Программа посвящена упражнениям, и я хотел бы создать контейнер (hbox / vbox) для каждого упражнения с соответствующей информацией.Проблема в том, что прямо сейчас, программа выглядит действительно некрасиво, потому что я генерирую hbox с чистым javafx с кодом ниже:

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-запросов в заполнителях в «шаблоне».Любая помощь оценивается как это сделать

1 Ответ

0 голосов
/ 19 мая 2018

Вы можете использовать пользовательский компонент FXML-шаблон (см. Также этот вопрос ).

По сути, вы можете сделать

<?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));
}

(или некоторую простую модификацию этого, если вы не хотите, чтобы код вашей базы данныхзнать о вашем интерфейсе ...).

...