2015-07-13 3 views
1

мне нужно отслеживать изменения в абсолютной позиции и размера узла в изменении javafx.Any, что обусловлено изменением размера окна или манипуляции пользователя, ...отслеживать изменения узлов, связанных в JavaFX

node.boundsInLocalProperty().addListener(new ChangeListener<Bounds>() { 

@Override 
public void changed(ObservableValue<? extends Bounds> observable,Bounds oldValue, Bounds newValue) { 

System.err.println("Changed!"); 


} 

}); 


node.boundsInParentProperty().addListener(new ChangeListener<Bounds>() { 

@Override 
public void changed(ObservableValue<? extends Bounds> observable,Bounds oldValue, Bounds newValue) { 

System.err.println("Changed!"); 


} 

}); 

Я попытался эти решения, но не работают!

, пожалуйста, помогите мне, спасибо.

+1

Вы пытались сохранить ссылки на свои ChangeListeners? Однажды у меня была проблема, когда сборщик мусора убрал их. Внутренне привязки реализуются с помощью WeakReferences. – Rekin

+0

нет, я не хранил ссылки. Как мне это сделать? Могу ли я сохранить их только в списке? – mhtb

+0

Точно так, да – Rekin

ответ

0

Это довольно тяжелое по производительности, так что я не рекомендую делать это с большим количеством узлов в графе сцены, но:

ObjectBinding<Bounds> boundsInScene = Bindings.createObjectBinding(
    () -> node.localToScene(node.getBoundsInLocal()), 
    node.localToSceneTransformProperty(), 
    node.boundsInLocalProperty()); 

boundsInScene.addListener((obs, oldBounds, newBounds) -> 
    System.err.println("Changed!")); 

Вы также можете сделать следующее, что может быть менее склонным досрочно вывоз мусора:

ChangeListener<Object> listener = (obs, oldValue, newValue) -> 
    System.err.println("New bounds in scene: "+node.localToScene(node.getBoundsInLocal())); 
node.localToSceneTransformProperty().addListener(listener); 
node.boundsInLocalProperty().addListener(listener); 
+0

К сожалению, у меня есть большое количество узлов на графике сцены. У вас есть лучшее решение, которое не оказывает сильного влияния на производительность? – mhtb

+0

Отслеживание этого обязательно будет интенсивным, независимо от того, как вы это сделаете. Проблема в том, что вам действительно нужно отслеживать все на графике сцены от узла до корня. Я рекомендую вам попробовать это и посмотреть, не пострадает ли производительность. Помимо этого, вы можете подумать, можете ли вы вообще не делать этого. –

+0

@James_D Я хочу то же самое ... У меня есть класс, и в этом классе я создаю прямоугольник рядом с некоторыми узлами ... Я добавил эту привязку для каждого узла, а вместо System.err.print я добавил метод чтобы установить расположение прямоугольника в соответствии с newBounds .... Но этот метод называется только один раз! вместо этого я должен каждый раз создавать объект этого класса ... поэтому он работает правильно и очень медленно, и программа будет висеть ... вы можете мне помочь? – faraa

Смежные вопросы