将 EventHandler 添加到 formsfx 字段
Adding EventHandler to formsfx Field
我正在使用 formsfx 并且掌握了它的窍门,但是我不知道如何使用
.addEvent 处理程序到字段。
EventHandler<KeyEvent> handler = new EventHandler<KeyEvent>() {
public void handle(KeyEvent event) {
System.out.println("Handling event " + event.getEventType());
}
};
Field.ofDoubleType(model.priceProperty())
.label("price")
.required("cant be empty")
.addEventHandler(handler).
然后我收到消息
addEventHandler
(javafx.event.EventType<com.dlsc.formsfx.model.event.FieldEvent>,
EventHandler<? super FieldEvent>)
in Field cannot be applied
to
(javafx.event.EventHandler<javafx.scene.input.KeyEvent>)
在我尝试使用同一场比赛但没有运气之后,我错过了一些东西,我只是不知道是什么。
说明说它接受 FieldEvent 类型和事件处理程序。
尝试使用:
model.priceProperty().addListener(event -> {
//your code here
});
Field.ofDoubleType returns 一个字段,它是对呈现的内容的包装。在 sceneGraph 上渲染的实际节点是 field.getRenderer()。不幸的是,这不是您要处理的实际控件。它又是表单控件(文本字段、选择框、复选框等)所有必需内容的包装器 (GridPane)。
getRenderer() returns SimpleControl 并且没有标准的 API 到 return 确切的表单控件。例如,SimpleTextControl 包含 TextField、TextArea 和 Label 作为其子项,并根据上下文在场景图中呈现适当的节点。
因此,很难在确切的节点上设置处理程序。 (因为缺少API)
所以您唯一可以访问的节点是渲染器(GridPane)。您可以尝试将处理程序设置为此 GridPane。但在大多数情况下它不会工作,因为大多数默认控件都使用处理程序中的事件。
解决问题的一种方法是,您可以依赖过滤器而不是处理程序。在 GridPane 上设置过滤器会让您知道要监听适当的事件。
所以你可以试试下面的代码:
EventHandler<KeyEvent> handler = new EventHandler<KeyEvent>() {
public void handle(KeyEvent event) {
System.out.println("Handling event " + event.getEventType());
}
};
Field priceField = Field.ofDoubleType(model.priceProperty())
.label("price")
.required("cant be empty");
priceField.getRenderer().addEventFilter(KeyEvent.KEY_PRESSED, handler);
更新: DemoModel.java formsfx 演示代码。
package com.dlsc.formsfx.demo.model;
import com.dlsc.formsfx.model.structure.Field;
import com.dlsc.formsfx.model.structure.Form;
import com.dlsc.formsfx.model.structure.Group;
import com.dlsc.formsfx.model.structure.Section;
import com.dlsc.formsfx.model.util.ResourceBundleService;
import com.dlsc.formsfx.model.validators.DoubleRangeValidator;
import com.dlsc.formsfx.model.validators.IntegerRangeValidator;
import com.dlsc.formsfx.model.validators.RegexValidator;
import com.dlsc.formsfx.model.validators.StringLengthValidator;
import com.dlsc.formsfx.view.controls.SimpleCheckBoxControl;
import com.dlsc.formsfx.view.controls.SimpleRadioButtonControl;
import com.dlsc.formsfx.view.util.ColSpan;
import javafx.event.EventHandler;
import javafx.scene.input.KeyEvent;
import java.util.Locale;
import java.util.ResourceBundle;
/**
* This class is used to create the form and holds all the necessary data. This
* class acts as a singleton where the current instance is available using
* {@code getInstance}.
*
* @author Sacha Schmid
* @author Rinesch Murugathas
*/
public final class DemoModel {
private Country country = new Country();
/**
* These are the resource bundles for german and english.
*/
private ResourceBundle rbDE = ResourceBundle.getBundle("demo-locale", new Locale("de", "CH"));
private ResourceBundle rbEN = ResourceBundle.getBundle("demo-locale", new Locale("en", "UK"));
/**
* The default locale is English, thus the {@code ResourceBundleService} is
* initialised with it.
*/
private ResourceBundleService rbs = new ResourceBundleService(rbEN);
private Form formInstance;
/**
* Creates or simply returns to form singleton instance.
*
* @return Returns the form instance.
*/
public Form getFormInstance() {
if (formInstance == null) {
createForm();
}
return formInstance;
}
/**
* Creates a new form instance with the required information.
*/
private void createForm() {
EventHandler<KeyEvent> handler = event -> System.out.println("Handling event " + event.getEventType());
Field field = Field.ofStringType(country.nameProperty())
.label("country_label")
.placeholder("country_placeholder")
.required("required_error_message")
.validate(StringLengthValidator.atLeast(2, "country_error_message"));
field.getRenderer().addEventFilter(KeyEvent.KEY_PRESSED,handler);
formInstance = Form.of(
Group.of(
field,
Field.ofStringType(country.isoProperty())
.label("ISO_3166_label")
.placeholder("ISO_3166_placeholder")
.required("required_error_message")
.validate(StringLengthValidator.exactly(2, "ISO_3166_error_message")),
Field.ofBooleanType(country.independenceProperty())
.label("independent_label")
.required("required_error_message"),
Field.ofDate(country.getIndependenceDay())
.label("independent_since_label")
.required("required_error_message")
.placeholder("independent_since_placeholder")
),
Section.of(
Field.ofStringType(country.currencyShortProperty())
.label("currency_label")
.placeholder("currency_placeholder")
.validate(StringLengthValidator.exactly(3, "currency_error_message"))
.span(ColSpan.HALF),
Field.ofStringType(country.currencyLongProperty())
.label("currency_long_label")
.placeholder("currency_long_placeholder")
.span(ColSpan.HALF),
Field.ofDoubleType(country.areaProperty())
.label("area_label")
.format("format_error_message")
.placeholder("area_placeholder")
.validate(DoubleRangeValidator.atLeast(1, "area_error_message"))
.span(ColSpan.HALF),
Field.ofStringType(country.tldProperty())
.label("internet_TLD_label")
.placeholder("internet_TLD_placeholder")
.span(ColSpan.HALF)
.validate(
StringLengthValidator.exactly(3, "internet_TLD_error_message"),
RegexValidator.forPattern("^.[a-z]{2}$", "internet_TLD_format_error_message")
),
Field.ofStringType(country.dateFormatProperty())
.label("date_format_label")
.placeholder("date_format_placeholder")
.multiline(true)
.span(ColSpan.HALF)
.validate(StringLengthValidator.atLeast(8, "date_format_error_message")),
Field.ofSingleSelectionType(country.allSidesProperty(), country.driverSideProperty())
.required("required_error_message")
.label("driving_label")
.span(ColSpan.HALF)
.render(new SimpleRadioButtonControl<>()),
Field.ofStringType(country.timeZoneProperty())
.label("time_zone_label")
.placeholder("time_zone_placeholder")
.span(ColSpan.HALF)
.validate(StringLengthValidator.exactly(3, "time_zone_error_message")),
Field.ofStringType(country.summerTimeZoneProperty())
.label("summer_time_zone_label")
.placeholder("summer_time_zone_placeholder")
.span(ColSpan.HALF)
.validate(StringLengthValidator.atLeast(3, "summer_time_zone_error_message"))
).title("other_information_label"),
Section.of(
Field.ofSingleSelectionType(country.allCapitalsProperty(), country.capitalProperty())
.label("capital_label")
.required("required_error_message")
.tooltip("capital_tooltip")
.span(ColSpan.HALF),
Field.ofIntegerType(country.populationProperty())
.label("population_label")
.format("format_error_message")
.placeholder("population_placeholder")
.required("required_error_message")
.span(ColSpan.HALF)
.validate(IntegerRangeValidator.atLeast(1, "population_error_message")),
Field.ofMultiSelectionType(country.allContinentsProperty(), country.continentsProperty())
.label("continent_label")
.required("required_error_message")
.span(ColSpan.HALF)
.render(new SimpleCheckBoxControl<>()),
Field.ofMultiSelectionType(country.allCitiesProperty(), country.germanCitiesProperty())
.label("german_cities_label")
.span(ColSpan.HALF),
Field.ofPasswordType("secret")
.label("secret_label")
.required("required_error_message")
.span(ColSpan.HALF)
.validate(StringLengthValidator.between(1, 10, "secret_error_message"))
).title("cities_and_population_label")
).title("form_label")
.i18n(rbs);
}
/**
* Sets the locale of the form.
*
* @param language The language identifier for the new locale. Either DE or EN.
*/
public void translate(String language) {
switch (language) {
case "EN":
rbs.changeLocale(rbEN);
break;
case "DE":
rbs.changeLocale(rbDE);
break;
default:
throw new IllegalArgumentException("Not a valid locale");
}
}
public Country getCountry() {
return country;
}
}
我正在使用 formsfx 并且掌握了它的窍门,但是我不知道如何使用 .addEvent 处理程序到字段。
EventHandler<KeyEvent> handler = new EventHandler<KeyEvent>() {
public void handle(KeyEvent event) {
System.out.println("Handling event " + event.getEventType());
}
};
Field.ofDoubleType(model.priceProperty())
.label("price")
.required("cant be empty")
.addEventHandler(handler).
然后我收到消息
addEventHandler
(javafx.event.EventType<com.dlsc.formsfx.model.event.FieldEvent>,
EventHandler<? super FieldEvent>)
in Field cannot be applied
to
(javafx.event.EventHandler<javafx.scene.input.KeyEvent>)
在我尝试使用同一场比赛但没有运气之后,我错过了一些东西,我只是不知道是什么。 说明说它接受 FieldEvent 类型和事件处理程序。
尝试使用:
model.priceProperty().addListener(event -> {
//your code here
});
Field.ofDoubleType returns 一个字段,它是对呈现的内容的包装。在 sceneGraph 上渲染的实际节点是 field.getRenderer()。不幸的是,这不是您要处理的实际控件。它又是表单控件(文本字段、选择框、复选框等)所有必需内容的包装器 (GridPane)。
getRenderer() returns SimpleControl 并且没有标准的 API 到 return 确切的表单控件。例如,SimpleTextControl 包含 TextField、TextArea 和 Label 作为其子项,并根据上下文在场景图中呈现适当的节点。
因此,很难在确切的节点上设置处理程序。 (因为缺少API)
所以您唯一可以访问的节点是渲染器(GridPane)。您可以尝试将处理程序设置为此 GridPane。但在大多数情况下它不会工作,因为大多数默认控件都使用处理程序中的事件。
解决问题的一种方法是,您可以依赖过滤器而不是处理程序。在 GridPane 上设置过滤器会让您知道要监听适当的事件。
所以你可以试试下面的代码:
EventHandler<KeyEvent> handler = new EventHandler<KeyEvent>() {
public void handle(KeyEvent event) {
System.out.println("Handling event " + event.getEventType());
}
};
Field priceField = Field.ofDoubleType(model.priceProperty())
.label("price")
.required("cant be empty");
priceField.getRenderer().addEventFilter(KeyEvent.KEY_PRESSED, handler);
更新: DemoModel.java formsfx 演示代码。
package com.dlsc.formsfx.demo.model;
import com.dlsc.formsfx.model.structure.Field;
import com.dlsc.formsfx.model.structure.Form;
import com.dlsc.formsfx.model.structure.Group;
import com.dlsc.formsfx.model.structure.Section;
import com.dlsc.formsfx.model.util.ResourceBundleService;
import com.dlsc.formsfx.model.validators.DoubleRangeValidator;
import com.dlsc.formsfx.model.validators.IntegerRangeValidator;
import com.dlsc.formsfx.model.validators.RegexValidator;
import com.dlsc.formsfx.model.validators.StringLengthValidator;
import com.dlsc.formsfx.view.controls.SimpleCheckBoxControl;
import com.dlsc.formsfx.view.controls.SimpleRadioButtonControl;
import com.dlsc.formsfx.view.util.ColSpan;
import javafx.event.EventHandler;
import javafx.scene.input.KeyEvent;
import java.util.Locale;
import java.util.ResourceBundle;
/**
* This class is used to create the form and holds all the necessary data. This
* class acts as a singleton where the current instance is available using
* {@code getInstance}.
*
* @author Sacha Schmid
* @author Rinesch Murugathas
*/
public final class DemoModel {
private Country country = new Country();
/**
* These are the resource bundles for german and english.
*/
private ResourceBundle rbDE = ResourceBundle.getBundle("demo-locale", new Locale("de", "CH"));
private ResourceBundle rbEN = ResourceBundle.getBundle("demo-locale", new Locale("en", "UK"));
/**
* The default locale is English, thus the {@code ResourceBundleService} is
* initialised with it.
*/
private ResourceBundleService rbs = new ResourceBundleService(rbEN);
private Form formInstance;
/**
* Creates or simply returns to form singleton instance.
*
* @return Returns the form instance.
*/
public Form getFormInstance() {
if (formInstance == null) {
createForm();
}
return formInstance;
}
/**
* Creates a new form instance with the required information.
*/
private void createForm() {
EventHandler<KeyEvent> handler = event -> System.out.println("Handling event " + event.getEventType());
Field field = Field.ofStringType(country.nameProperty())
.label("country_label")
.placeholder("country_placeholder")
.required("required_error_message")
.validate(StringLengthValidator.atLeast(2, "country_error_message"));
field.getRenderer().addEventFilter(KeyEvent.KEY_PRESSED,handler);
formInstance = Form.of(
Group.of(
field,
Field.ofStringType(country.isoProperty())
.label("ISO_3166_label")
.placeholder("ISO_3166_placeholder")
.required("required_error_message")
.validate(StringLengthValidator.exactly(2, "ISO_3166_error_message")),
Field.ofBooleanType(country.independenceProperty())
.label("independent_label")
.required("required_error_message"),
Field.ofDate(country.getIndependenceDay())
.label("independent_since_label")
.required("required_error_message")
.placeholder("independent_since_placeholder")
),
Section.of(
Field.ofStringType(country.currencyShortProperty())
.label("currency_label")
.placeholder("currency_placeholder")
.validate(StringLengthValidator.exactly(3, "currency_error_message"))
.span(ColSpan.HALF),
Field.ofStringType(country.currencyLongProperty())
.label("currency_long_label")
.placeholder("currency_long_placeholder")
.span(ColSpan.HALF),
Field.ofDoubleType(country.areaProperty())
.label("area_label")
.format("format_error_message")
.placeholder("area_placeholder")
.validate(DoubleRangeValidator.atLeast(1, "area_error_message"))
.span(ColSpan.HALF),
Field.ofStringType(country.tldProperty())
.label("internet_TLD_label")
.placeholder("internet_TLD_placeholder")
.span(ColSpan.HALF)
.validate(
StringLengthValidator.exactly(3, "internet_TLD_error_message"),
RegexValidator.forPattern("^.[a-z]{2}$", "internet_TLD_format_error_message")
),
Field.ofStringType(country.dateFormatProperty())
.label("date_format_label")
.placeholder("date_format_placeholder")
.multiline(true)
.span(ColSpan.HALF)
.validate(StringLengthValidator.atLeast(8, "date_format_error_message")),
Field.ofSingleSelectionType(country.allSidesProperty(), country.driverSideProperty())
.required("required_error_message")
.label("driving_label")
.span(ColSpan.HALF)
.render(new SimpleRadioButtonControl<>()),
Field.ofStringType(country.timeZoneProperty())
.label("time_zone_label")
.placeholder("time_zone_placeholder")
.span(ColSpan.HALF)
.validate(StringLengthValidator.exactly(3, "time_zone_error_message")),
Field.ofStringType(country.summerTimeZoneProperty())
.label("summer_time_zone_label")
.placeholder("summer_time_zone_placeholder")
.span(ColSpan.HALF)
.validate(StringLengthValidator.atLeast(3, "summer_time_zone_error_message"))
).title("other_information_label"),
Section.of(
Field.ofSingleSelectionType(country.allCapitalsProperty(), country.capitalProperty())
.label("capital_label")
.required("required_error_message")
.tooltip("capital_tooltip")
.span(ColSpan.HALF),
Field.ofIntegerType(country.populationProperty())
.label("population_label")
.format("format_error_message")
.placeholder("population_placeholder")
.required("required_error_message")
.span(ColSpan.HALF)
.validate(IntegerRangeValidator.atLeast(1, "population_error_message")),
Field.ofMultiSelectionType(country.allContinentsProperty(), country.continentsProperty())
.label("continent_label")
.required("required_error_message")
.span(ColSpan.HALF)
.render(new SimpleCheckBoxControl<>()),
Field.ofMultiSelectionType(country.allCitiesProperty(), country.germanCitiesProperty())
.label("german_cities_label")
.span(ColSpan.HALF),
Field.ofPasswordType("secret")
.label("secret_label")
.required("required_error_message")
.span(ColSpan.HALF)
.validate(StringLengthValidator.between(1, 10, "secret_error_message"))
).title("cities_and_population_label")
).title("form_label")
.i18n(rbs);
}
/**
* Sets the locale of the form.
*
* @param language The language identifier for the new locale. Either DE or EN.
*/
public void translate(String language) {
switch (language) {
case "EN":
rbs.changeLocale(rbEN);
break;
case "DE":
rbs.changeLocale(rbDE);
break;
default:
throw new IllegalArgumentException("Not a valid locale");
}
}
public Country getCountry() {
return country;
}
}