On 12/11/2014 6:08 PM, Knute Johnson wrote:
> The other question I have is why does the ObservableValue require a cast
> to StringProperty in both of the working examples and why do I declare
> it as <? extends String>?
> class LengthListener<String> implements ChangeListener<String> {
> private final int length;
>
> public LengthListener(int length) {
> this.length = length;
> }
>
> @Override public void changed(
> ObservableValue<? extends String> observable,
> String oldValue,String newValue) {
> if (newValue.length() > length)
> ((StringProperty)observable).setValue(
> newValue.substring(0,length));
> }
> }
> textField.textProperty().addListener(new LengthListener(4));
Formal type of observable:
interface javafx.beans.value.ObservableValue
Actual ype of observable:
class javafx.scene.control.TextInputControl$TextProperty
**** class javafx.beans.property.StringProperty
******** interface javafx.beans.value.ObservableValue
The cast is necessary!
Arne