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

Reply via email to