It actually is fairly simple. This is what ideally should happen:
CalendarTextField extends Control
- Node has: ReadOnlyBooleanProperty focusProperty();
CalendarTextFieldSkin extends Skin
- private TextField textField = new TextField();
- *getSkinnable().focusProperty().bind(textField.focusProperty())*
But this is not allowed, so I got it working like this:
CalendarTextFieldSkin extends Skin
- private TextField textField = new TextField();
- public BooleanProperty focusForward = new SimpleBooleanProperty();
- textField.focusedProperty().addListener( (observable) -> {
focusForward.set(textField.focusedProperty().get());
});
CalendarTextField extends Control
- constructor:
skinProperty().addListener( (observable) -> {
Skin<?> skin = getSkin();
if (skin instanceof CalendarTextFieldSkin) {
CalendarTextFieldSkin lCalendarTextFieldSkin =
(CalendarTextFieldSkin)skin;
lCalendarTextFieldSkin.focusForward.addListener( (observable2)
-> {
*super.setFocused(lCalendarTextFieldSkin.focusForward.get());*
});
}
});
https://github.com/JFXtras/jfxtras/blob/8.0/jfxtras-controls/src/main/java/jfxtras/internal/scene/control/skin/CalendarTextFieldSkin.java
line 146 and 209
https://github.com/JFXtras/jfxtras/blob/8.0/jfxtras-controls/src/main/java/jfxtras/scene/control/CalendarTextField.java
line 90
On 23-2-2015 09:33, Michael Heinrichs wrote:
Hi Tom,
can you provide a code example? I am not sure I understand all the details
correctly. :) In particular it is important to know which of the properties are
defined in your code and which properties you are just using. For example it is
possible to bind a readonly property, but only if it is defined in your code.
Cheers,
Michael
On 23 Feb 2015, at 09:03, Tom Eugelink <[email protected]> wrote:
JFXtras has a number of extended textfields (BigDecimal, Calendar, LocalDate,
...). These controls use a TextField in their skin to compose this control.
These extended textfield controls have a readonly focusProperty()... What would
be the best way to forward the focusProperty of the TextField to the control's
focusProperty?
- Binding is not possible, because it is read only.
- Setting the value in the skin is not possible, because it is read only.
- setFocused method is protected final
What works is the following setup:
- create a _public_ focusForwardProperty in the Skin
- listen to the focusProperty of TextField and set the focusForwardProperty
accordingly
- listen to the skinProperty in the Control and when set, bind a listener to
the focusForwardProperty
- in this listener call setFocused with the value of focusForwardProperty
This approach at least prevents the control's API to be polluted with public
methods, but requires a property just for the sake of publishing the value.
Ideally one would like to bind both focusProperties.
Tom