FXForm2: Элементы управления из переопределенных элементов управления FXMLSkin создаются фабриками редакторов? - PullRequest
0 голосов
/ 23 октября 2018

Я использую FXForm2 для генерации формы JavaFX из моего компонента JavaFX, и я хочу настроить элемент управления редактора для простого StringProperty в моем компоненте при использовании экземпляра FXMLSkin.

Я хотел бы показатьПоле выбора с доступными опциями для значения свойства строки.Если я установлю FXMLSkin (с FXML, определяющим поле выбора) в моей форме и , я определю ListChoiceBoxFactory с доступными опциями программно, будет ли ListChoiceBoxFactory игнорироваться при создании формы?

Мои первые эксперименты, кажется, подтверждают, что поле выбора, определенное FXML, «переопределяет» поле выбора, созданное фабрикой, но я хотел бы знать, является ли это ожидаемым поведением или я делаючто-то не так.

Вот код, который я использую:

import java.net.URL;

import com.dooapp.fxform.FXForm;
import com.dooapp.fxform.annotation.Accessor;
import com.dooapp.fxform.annotation.NonVisual;
import com.dooapp.fxform.view.factory.DefaultFactoryProvider;
import com.dooapp.fxform.view.factory.impl.ListChoiceBoxFactory;
import com.dooapp.fxform.view.skin.FXMLSkin;

import javafx.application.Application;
import javafx.beans.property.ListProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class SimpleChoiceBoxForm extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        MyBean bean = new MyBean();

        FXForm<MyBean> form = new FXForm<>();
        URL fxmlUrl = this.getClass().getResource("SimpleFormEditor.fxml");
        form.setSkin(new FXMLSkin(form, fxmlUrl));

        DefaultFactoryProvider factoryProvider = new DefaultFactoryProvider();
        factoryProvider.addFactory(element -> element.getName().equals(bean.format.getName()), new ListChoiceBoxFactory<>(bean.availableFormats));
        form.setEditorFactoryProvider(factoryProvider);

        form.setSource(bean);

        Pane root = new Pane(form);
        Scene scene = new Scene(root, 800, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    @Accessor(value = Accessor.AccessType.METHOD)
    public static class MyBean {
        @NonVisual
        public static final ObservableList<String> EXPORT_FORMATS = FXCollections.observableArrayList("A", "B", "C");

        private ObjectProperty<String> format = new SimpleObjectProperty<>(this, "format", EXPORT_FORMATS.get(0));
        @NonVisual
        private ListProperty<String> availableFormats = new SimpleListProperty<>(this, "availableFormats", EXPORT_FORMATS);

        public String getFormat() {
            return format.get();
        }

        public void setFormat(String format) {
            this.format.set(format);
        }

        public ObjectProperty<String> formatProperty() {
            return format;
        }
    }
}

Файл FXML выглядит так:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<StackPane xmlns="http://javafx.com/javafx/8.0.172" xmlns:fx="http://javafx.com/fxml/1" fx:id="root">
    <VBox>
        <children>
            <Label fx:id="label" id="format-form-label"/>
            <ChoiceBox fx:id="choiceBox" id="format-form-editor"/>
        </children>
    </VBox>
</StackPane>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...