일부 바인딩 기능을 사용하여 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
'DoubleProperty'의 익명 클래스 구현을 만드는 이유는 무엇입니까? 당신의 문제는 아마 base ('super') 메소드를 호출하지 않고'invalidated' 메소드를 오버라이드 (override) 할 때 발생합니다. – Itai
@sillyfly 익명의 클래스를 만들었는데 왜냐하면 화면 상에 많은 'CustomControl'을 가질 필요가 있고 속성에서 리스너를 설정하는 대신 익명의 클래스를 사용하면 메모리 사용량이 줄어들고 컴퓨팅 복잡성이 줄어들 기 때문입니다. 또한'invalidate()'의 기본 구현은 비어 있으므로'super.invalidate()'를 호출하면 많이 변경되지 않습니다. –
[MCVE]를 게시하십시오. 나는 이것을 테스트했고 예상대로 정확하게 작동했다 ('System.out.println (control2.getPosition());'은'50.0'라고 표시했다). 게시하지 않은 코드의 다른 부분에 오류가 있어야합니다. –