Hm, ok -- it is correct that it doesn't fail, the code runs without any
problem and everything works as expected.
But, what would be the way to avoid these messages in my log then?
Something like:
Bindings.select( Bindings.when(dataProperty().isNull()).then( ???
).otherwise(dataProperty()), "castings") );
??
I'd prefer to just turn these warnings off unless there is a really good
reason to have them (ie, they indicate a logic error or other bug,
something I can resolve...)
In my case the dataProperty() is often bound to the selection of a
ListView -- if you have something valid selected, then a Detail Pane is
filled in with information about the selected item. When nothing is
selected (ie, it is null), then the Detail Pane should remain empty... I
donot want to have to remove/recreate these bindings every time some
property becomes null.
Also, it seems rather wierd that JavaFX will complain about nulls in the
first part of the Bindings.select(), but will happily traverse the graph
(with or without nulls) for the other parts.
Do I have to add an extra level of indirection to get rid off these
messages, ie something like:
private final ObjectProperty<Media> data = new SimpleObjectProperty<>();
public ObjectProperty<Media> dataProperty() { return data; }
private ObjectProperty<ObjectProperty<Media>> metaDataProperty = new
SimpleObjectProperty<>(dataProperty()); // extra indirection...
public ObjectProperty<ObjectProperty<Media>> metaDataProperty() {
return metaDataProperty ; }
So that I can then do a binding like:
Bindings.select(metaDataProperty(), "data", "castings");
That seems.. cumbersome :)
--John
On 6/06/2013 09:34, Martin Sladecek wrote:
JavaFX should not fail in these cases, but doesn't consider that a
valid state, so it always prints a warning on the stderr, for the
developer to see something went wrong.
Regards,
-Martin
On 5.6.2013 21:38, John Hendrikx wrote:
Hi List,
I'm getting some log messages sometimes (see at the end) about
properties being null (whereas I didn't get them before in JavaFX 2.2).
Is this intended as an informative message to the developer,
something I should report, or just debug code for the JavaFX team?
In this case, the binding is null, and that's fine -- it will be
populated later, but the binding is already in place -- I thought
JavaFX was designed to allow nulls in a chain of bindings and
fall back to reasonable defaults for things like Strings, numbers
etc? Am I doing something wrong?
Code:
{
private final ObjectProperty<Media> data = new
SimpleObjectProperty<>();
public ObjectProperty<Media> dataProperty() { return data; }
protected final ObjectBinding<ObservableList<Casting>> castings =
Bindings.select(dataProperty(), "castings");
}
Log:
Jun 05, 2013 9:15:55 PM
com.sun.javafx.binding.SelectBinding$SelectBindingHelper
getObservableValue
WARNING: Exception while evaluating select-binding [castings]
Jun 05, 2013 9:15:55 PM
com.sun.javafx.binding.SelectBinding$SelectBindingHelper
getObservableValue
WARNING: Property 'castings' in ObjectProperty [bound, value: null]
is null
java.lang.NullPointerException
at
com.sun.javafx.binding.SelectBinding$SelectBindingHelper.getObservableValue(SelectBinding.java:481)
at
com.sun.javafx.binding.SelectBinding$AsObject.computeValue(SelectBinding.java:92)
at javafx.beans.binding.ObjectBinding.get(ObjectBinding.java:152)
at
javafx.beans.binding.ObjectExpression.getValue(ObjectExpression.java:49)
at
com.sun.javafx.binding.ExpressionHelper.addListener(ExpressionHelper.java:53)
at
javafx.beans.binding.ObjectBinding.addListener(ObjectBinding.java:71)
at
javafx.beans.property.ObjectPropertyBase.bind(ObjectPropertyBase.java:170)
at
hs.mediasystem.TitledBlockSample.createCastingsRow(TitledBlockSample.java:114)
at hs.mediasystem.TitledBlockSample.start(TitledBlockSample.java:78)
at
com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:810)
at
com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:260)
at
com.sun.javafx.application.PlatformImpl$5$1.run(PlatformImpl.java:226)
at
com.sun.javafx.application.PlatformImpl$5$1.run(PlatformImpl.java:223)
at java.security.AccessController.doPrivileged(Native Method)
at
com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:223)
at
com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at
com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
at
com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:101)
at java.lang.Thread.run(Thread.java:724)
Regards,
--John