And do you ever validate the properties?
The invalidation listener was designed in a way it actually expects the
property to be validated sometimes after the invalidation was called.
Once the property is invalidated, no listeners are called until the
property is validated again.
This is because we support the following use-case:
* property is invalidated. Anything that depends on it (like a binding)
can be invalidated too.
* any subsequent invaliadion is irrelevant, as all dependeds are also
invalidated
* once you need to compute the dependents of the property, you need to
validate the property.
-Martin
On 09/27/2013 07:06 AM, Tom Eugelink wrote:
I'm a bit ashamed to tell that I have not investigated this further
yet. It feels like one of those issues that probably require a lot of
spare time to figure out, and I decided to invest that time in more
immediate issues around JFXtras. People are starting to use JFX in
real life applications, and I wanted to make sure their problems are
tackled first. My demo code needs to wait. This weekend I'll try to
reproduce the problem again, should be easy to do.
Tom
On 2013-09-26 21:56, Richard Bair wrote:
Hi Tom,
Did this issue ever get resolved? It sounds very strange indeed, and
we should have a JIRA filed for it if there is not one already.
Thanks
Richard
On Apr 8, 2013, at 3:48 AM, Tom Eugelink <[email protected]> wrote:
Hi Werner,
It indeed is very similar (my code is public on Github, so no use
adding it here), especially the selectedToggleProperty listener. I
chose to reuse as much of the existing approach, being the
getUserData().
What would be of interest to me is:
- the exact declaration of the enumValueProperty
- how you listen to changes on enumValueProperty
- and of course: what happens if you hide/disable the toggles with
only one listener attached
Tom
On 2013-04-08 11:51, Werner Lehmann wrote:
Hi Tom,
I did something similar: toggle group for toggles which correspond
to enum members. This one assume that the toggles correspond to the
enum members in their declared order. It also uses an invalidation
listener and disabling/enabling a toggle keeps the listener
functional as I just tested with a test application.
public class MintEnumToggleGroup<E extends Enum<E>> extends
ToggleGroup
{
public MintEnumToggleGroup(Class<E> enumClass)
{
this.enumClass = enumClass;
selectedToggleProperty().addListener(new InvalidationListener()
{
@Override
public void invalidated(Observable observable)
{
Toggle toggle = getSelectedToggle();
E value = null;
if (toggle != null)
{
int ordinal =
MintEnumToggleGroup.this.getToggles().indexOf(toggle);
value = MintEnumToggleGroup.this.enumClass
.getEnumConstants()[ordinal];
}
if (enumValue.get() != value)
enumValue.set(value);
}
});
...
}
/**
* Bidirectionally bindable property representing the enum member
* of the selected toggle.
*/
public ObjectProperty<E> enumValueProperty() { return enumValue; }
public E getEnumValue() { return enumValueProperty().get(); }
public void setEnumValue(E value) {
enumValueProperty().set(value); }
}
Looks similar to what you are doing. Let me know if you want to
look at the full source (toggle group and testcase).
Rgds
Werner
On 07.04.2013 21:28, Tom Eugelink wrote:
Again some strange behavior I could use some pointers with. In
JFXtras I've created an extended ToggleGroup which has a value
property.
https://github.com/JFXtras/jfxtras-labs/blob/2.2/src/main/java/jfxtras/labs/scene/control/ToggleGroupValue.java
Basically what it does is listen to the selectedToggleProperty of
ToggleGroup, and upon invalidation gets the user data associated
with the now active toggle and puts that in the valueProperty.
Simple, and now you can register and listen to the value of the
toggle group. Which is exactly what I do in my basketball
application by registering to the invalidated event.
toggleGroup.valueProperty().addListener(new
InvalidationListener() {...});
Now I have one very strange behavior; if I disable or hide the
toggles, and then re-enable/show them again, the invalidation
listener is no longer called. Some how it seems to have been
removed from the listeners list. But the API documentation
explicitly says it is a strong reference.
http://docs.oracle.com/javafx/2/api/javafx/beans/Observable.html#addListener(javafx.beans.InvalidationListener)
If I add a second dummy listener, then the first listener is not
removed when disabled/hidden.
It very much reeks like a garbage collection thing. Any suggestions?
Tom