Я использую 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>