2017-02-06 3 views
1

일부 바인딩 기능을 사용하여 JavaFX에서 사용자 지정 컨트롤을 만들려고합니다. 이것은 내 문제입니다 : 나는 사용자 정의 컨트롤 안에있는 요소의 위치를 ​​계산하는 데 사용하는 DoubleProperty 클래스가 있습니다. 내 응용 프로그램에서JavaFX 속성의 invalidate() 메서드가 바인딩과 함께 호출되지 않았습니다.

public class CustomControl extends Region { 
    private DoubleProperty positionProperty; 

    public CustomControl() { 
    positionProperty= new DoublePropertyBase(0.0) { 
     @Override public Object getBean() { return CustomControl.this; } 
     @Override public String getName() { return "position"; } 
     @Override protected void invalidated() { updatePostion(); } 
    }; 
    } 

    public DoubleProperty positionProperty() { return positionProperty; } 
    public double getPosition() { return positionProperty.get(); } 
    public void setPosition(double value) { positionProperty.set(value); } 

    private void updatePosition() { 
    double value = doubleProperty.get(); 
    //compute the new position using value 
    } 
} 

내가 두 CustomControl의가 있고 내가 그 첫 번째의 방법 setPosition() 호출 할 때, 두 번째뿐만 아니라 그 구성 요소의 위치를 ​​갱신하도록하려면 다음은 코드입니다. 내가 전화를 사실 때, 나는 control1의 구성 요소의 위치가 업데이트됩니다

control1.setPosition(50.0); 

예를 들어 호출 할 때 다음

CustomControl control1 = new CustomControl(); 
CustomControl control2 = new CustomControl(); 
control2.positionProperty.bind(control1.positionProperty); 

:이 같은 두 CustomControl의의 positionProperty을 바인더 제본 이렇게하려면 방법 setPosition(), 방법 invalidated()이 이고 수치가 control1인데 실제로 보았을 때 인 contol2 중 하나가 아닙니다. 내가 원하는 걸 어떻게 얻을 수 있니? 고맙습니다!

PS : 나는 또한 bind() 작품을 대신하는 방법 bindBidirectional()을 사용하지만,하는 것은 너무에만 bind()를 사용하여 작동하지 것을 발견?

편집 : 예제 코드는 여기에 있습니다 : https://[email protected]/luca_bertolini/customcontrolexample.git

+0

'DoubleProperty'의 익명 클래스 구현을 만드는 이유는 무엇입니까? 당신의 문제는 아마 base ('super') 메소드를 호출하지 않고'invalidated' 메소드를 오버라이드 (override) 할 때 발생합니다. – Itai

+0

@sillyfly 익명의 클래스를 만들었는데 왜냐하면 화면 상에 많은 'CustomControl'을 가질 필요가 있고 속성에서 리스너를 설정하는 대신 익명의 클래스를 사용하면 메모리 사용량이 줄어들고 컴퓨팅 복잡성이 줄어들 기 때문입니다. 또한'invalidate()'의 기본 구현은 비어 있으므로'super.invalidate()'를 호출하면 많이 변경되지 않습니다. –

+0

[MCVE]를 게시하십시오. 나는 이것을 테스트했고 예상대로 정확하게 작동했다 ('System.out.println (control2.getPosition());'은'50.0'라고 표시했다). 게시하지 않은 코드의 다른 부분에 오류가 있어야합니다. –

답변

1

자바 FX는 변화가 out.positionProperty 개체에서 발생하는 경우, 새 값이 바로 고려되지 않음을 의미하는 모든 바인딩에 대한 게으른 평가를 사용합니다. 이 값은 나중에 값이 요청 된 경우에만 나중에 발생합니다.

out.positionProperty().addListener(new InvalidationListener() { 
    @Override 
    public void invalidated(final Observable observable) { 
     // System.out.println("It must go now."); 
    } 
}); 

을 당신은 당신의 코드가 작동이 시간은 당신이 원하는 것을 볼 수 있습니다 :

이보십시오.

+0

예, 작동합니다. 나는 그것이 내가 원하는 것을 성취 할 수있는 유일한 방법이라고 생각한다. 고맙습니다! –

+0

당신은 오신 것을 환영합니다 .. – Meziane

관련 문제