diff --git a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/BooleanField.java b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/BooleanField.java index 2e0520d..6954106 100644 --- a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/BooleanField.java +++ b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/BooleanField.java @@ -53,7 +53,7 @@ public Boolean fromString(String string) { return Boolean.parseBoolean(string); } }; - renderer = new SimpleBooleanControl(); + rendererSupplier = () -> new SimpleBooleanControl(); userInput.set(stringConverter.toString(value.getValue())); } diff --git a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/DateField.java b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/DateField.java index 0e8398c..f6210d9 100644 --- a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/DateField.java +++ b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/DateField.java @@ -54,7 +54,7 @@ public DateField(ObjectProperty valueProperty, ObjectProperty new SimpleDateControl(); userInput.setValue(null); userInput.setValue(stringConverter.toString((LocalDate) persistentValue.getValue())); } diff --git a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/DoubleField.java b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/DoubleField.java index 6a5e487..1ea4e1d 100644 --- a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/DoubleField.java +++ b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/DoubleField.java @@ -52,7 +52,7 @@ public Double fromString(String string) { return Double.parseDouble(string); } }; - renderer = new SimpleDoubleControl(); + rendererSupplier = () -> new SimpleDoubleControl(); userInput.set(stringConverter.toString(value.getValue())); } diff --git a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/Field.java b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/Field.java index c50ff2e..6cd1025 100644 --- a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/Field.java +++ b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/Field.java @@ -46,6 +46,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Supplier; import java.util.stream.Collectors; /** @@ -145,6 +146,7 @@ public abstract class Field> extends Element implements Fo protected TranslationService translationService; protected SimpleControl renderer; + protected Supplier> rendererSupplier; protected final Map,List>> eventHandlers = new ConcurrentHashMap<>(); @@ -633,6 +635,20 @@ public F render(SimpleControl newValue) { return (F) this; } + /** + * Sets the control supplier that renders this field. + * The supplier is only called when required, i.e., when the GUI is created. + * + * @param newValue + * The new control supplier to render the field. + * + * @return Returns the current field to allow for chaining. + */ + public F render(Supplier> newValue) { + rendererSupplier = newValue; + return (F) this; + } + /** * Activates or deactivates the {@code bindingModeListener} based on the * given {@code BindingMode}. @@ -794,6 +810,10 @@ public boolean isI18N() { } public SimpleControl getRenderer() { + if (renderer == null) { + renderer = rendererSupplier.get(); + } + return renderer; } diff --git a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/IntegerField.java b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/IntegerField.java index e1ffbd1..ca23939 100644 --- a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/IntegerField.java +++ b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/IntegerField.java @@ -53,7 +53,7 @@ public Integer fromString(String string) { return Integer.parseInt(string); } }; - renderer = new SimpleIntegerControl(); + rendererSupplier = () -> new SimpleIntegerControl(); userInput.set(stringConverter.toString(value.getValue())); } diff --git a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/MultiSelectionField.java b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/MultiSelectionField.java index 10f8138..d8f57f9 100644 --- a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/MultiSelectionField.java +++ b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/MultiSelectionField.java @@ -100,7 +100,7 @@ protected MultiSelectionField(ListProperty items, List selection) { persistentSelection.clear(); }); - renderer = new SimpleListViewControl<>(); + rendererSupplier = () -> new SimpleListViewControl<>(); } /** diff --git a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/PasswordField.java b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/PasswordField.java index dde5718..f722506 100644 --- a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/PasswordField.java +++ b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/PasswordField.java @@ -53,7 +53,7 @@ public String fromString(String string) { return string; } }; - renderer = new SimplePasswordControl(); + rendererSupplier = () -> new SimplePasswordControl(); userInput.set(stringConverter.toString(value.getValue())); } diff --git a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/SingleSelectionField.java b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/SingleSelectionField.java index 8f2fbde..5d36b70 100644 --- a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/SingleSelectionField.java +++ b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/SingleSelectionField.java @@ -96,7 +96,7 @@ protected SingleSelectionField(ListProperty items, int selection) { persistentSelection.setValue(null); }); - renderer = new SimpleComboBoxControl<>(); + rendererSupplier = () -> new SimpleComboBoxControl<>(); } /** diff --git a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/StringField.java b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/StringField.java index a746d3c..b125258 100644 --- a/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/StringField.java +++ b/formsfx-core/src/main/java/com/dlsc/formsfx/model/structure/StringField.java @@ -56,7 +56,7 @@ public String fromString(String string) { return string; } }; - renderer = new SimpleTextControl(); + rendererSupplier = () -> new SimpleTextControl(); userInput.set(stringConverter.toString(value.getValue())); } diff --git a/formsfx-demo/src/main/java/com/dlsc/formsfx/demo/model/DemoModel.java b/formsfx-demo/src/main/java/com/dlsc/formsfx/demo/model/DemoModel.java index 91c2baa..cb58e9c 100644 --- a/formsfx-demo/src/main/java/com/dlsc/formsfx/demo/model/DemoModel.java +++ b/formsfx-demo/src/main/java/com/dlsc/formsfx/demo/model/DemoModel.java @@ -113,7 +113,7 @@ private void createForm() { .required("required_error_message") .label("driving_label") .span(ColSpan.HALF) - .render(new SimpleRadioButtonControl<>()), + .render(() -> new SimpleRadioButtonControl<>()), Field.ofStringType(country.timeZoneProperty()) .label("time_zone_label") .placeholder("time_zone_placeholder") @@ -142,7 +142,7 @@ private void createForm() { .label("continent_label") .required("required_error_message") .span(ColSpan.HALF) - .render(new SimpleCheckBoxControl<>()), + .render(() -> new SimpleCheckBoxControl<>()), Field.ofMultiSelectionType(country.allCitiesProperty(), country.germanCitiesProperty()) .label("german_cities_label") .span(ColSpan.HALF),