Hi Richard,

I tried to reproduce the bug and so far it has not occurred anymore. So it 
seems it has magically resolved itself.

Regards,

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



Reply via email to