2013-02-27 2 views
1

Я ищу, чтобы получить userData элемента, когда такой элемент запускается через Listener. В принципе, получите ссылку на «владельца» ObservableValue, в случае ChangeListener.Доступ к userData от слушателя

Я думаю, что это может быть лучше продемонстрировано с помощью примера:

for(/*something*/) { 
    CheckBox newBox = new CheckBox("My Label " + i); 
    newBox.setSelected(true); 
    newBox.setUserData(object); //setting this object to access later 
    newBox.selectedProperty().addListener(new ChangeListener<Boolean>() { 
     public void changed(ObservableValue<? extends Boolean> ov, Boolean old_val, Boolean new_val) { 
      //Here I would like to call something to get the UserData 
      //I have just set. I would need to access "object" set above. 
     } 
    }); 
} 

Я не нашел способ сделать это. На данный момент я могу установить id этого флажка и с помощью этого id go найти нужный элемент, но это, похоже, противоречит тому, что я могу установить объект (userData) на этот узел. Разве это не так, как должно использоваться userData?

ответ

1

Используйте ключевое слово final:

final CheckBox newBox = new CheckBox("My Label " + i); 

Затем получить доступ с помощью:

newBox.getUserData() 
+0

Wow. Гораздо проще, чем мое решение ... Думаю, мне нужно немного вернуться к книгам и вернуться на несколько шагов. 'final', это все, что мне нужно. Знал, что это должно было быть проще, я подумал, что – blo0p3r

+0

Да, это довольно сложно в финале, и не каждая книга уделяет должное внимание такому случаю. –

0

Вот решение, которое я нашел для этой задачи (при условии, что я изначально прошу не представляется возможным).

В результате я создал реализацию ChangeListener, которая реализовала эту функцию. Это Listener выглядит следующим образом:

public class ChangeListenerWithData implements ChangeListener<Boolean> { 

    private Object userData; 

    public ChangeListenerWithData(Node node) { 
     userData = node.getUserData(); 
    } 

    public Object getUserData() { 
     return userData; 
    } 

    public void setUserData(Object userData) { 
     this.userData = userData; 
    } 

    @Override 
    public void changed(ObservableValue<? extends Boolean> observable, 
      Boolean oldValue, Boolean newValue) { 
     // TODO Auto-generated method stub 

    } 

} 

Мой код тогда становится:

for(/*something*/) { 
    CheckBox newBox = new CheckBox("My Label " + i); 
    newBox.setSelected(true); 
    newBox.setUserData(object); //setting this object to access later 
    newBox.selectedProperty().addListener(new ChangeListenerWithData(newBox) { 
     public void changed(ObservableValue<? extends Boolean> ov, Boolean old_val, Boolean new_val) { 
      //accessing user data 
      context.getMyMap().get(this.getUserData().toString()); 
     } 
    }); 
} 

Я всегда открыт для лучшего решения, но в то же время, я надеюсь, что это может помочь кому-то, как хорошо!

0

У меня есть массивы CheckBoxes и TextFields, все с использованием тех же слушателей, и я использую userData сказать, что есть что:

cb.setOnAction(new EventHandler<ActionEvent>() { 
    @Override 
    public void handle(final ActionEvent event) { 
     final CheckBox source = (CheckBox) event.getSource(); 
     System.out.println(source.getUserData()); 
     } 
    }); 
Смежные вопросы