2016-11-24 5 views
1

컨트롤의 visibleProperty()이 있다고 가정 해 봅시다. 응용 프로그램의 어느 곳에서나 BooleanProperty에 바인딩되어 있습니다.JavaFX - 데이터 바인딩 - 추가 BooleanBinding

내가 얻고 싶었던 것은 코드 조각에 추가 바인딩을 추가하여 가시성이 예 : 기존 또는 향후 바인딩에 관계없이 항상 거짓입니다. 그러나 false를 반환하는 바인딩이 있으면 visiblity를 true로 설정할 수 없습니다. 그래서 부울 논리의 일종을 구현해야합니다.

첫 번째 시도는 OR/AND- 연결을 사용하는 것이 었습니다.

tableColumn.visibleProperty().and(Bindings.createBooleanBinding(() -> false)); 

하지만 다음 예에서 보는 것처럼 작동하지 않습니다.

public static void main(String[] args) { 
    BooleanProperty a = new SimpleBooleanProperty(false); 
    BooleanProperty b = new SimpleBooleanProperty(true); 
    a.bind(b); 
    System.out.println(a.get()); 
    a.and(Bindings.createBooleanBinding(() -> false)); 
    System.out.println(a.getValue());  
} 

어쩌면 당신의 누군가가 더 창의적인 아이디어를 가지고 있을지도 모릅니다.

들으, 당신은 단순히 visibleProperty에 바인딩 additinal을 추가 할 수 있습니다이 경우

+0

질문은 실제로 의미가 없습니다. 'a.bind (b)'는'a'는 항상'b'와 같은 값을 가질 것이라는 것을 의미합니다.'bind'가 의미하는 바를 변경하는 코드를 실행하려고하는 것 같습니다 : 단지 그렇게 할 방법이 없습니다. 'a'의 값을 좀 더 복잡한 표현식에 의존하려면보다 복잡한 표현식에 바인딩하면됩니다. 'a.bind (b.and (Bindings.createBooleanBinding (() -> false)))); ' –

답변

2

결혼.

예 :

ButtonvisibleProperty는 당신이 토글을 누르면 따라서, 버튼을 보이거나 unvisible되면, ToggleButtonselectedProperty에 바인딩됩니다.

세 번째 단추를 누르면 false으로 항상 표시되는 Button 첫 번째 visibleProperty에 새 바인딩이 추가됩니다. 이 순간부터 ToggleButton은 아무 효과가 없습니다.

BorderPane root = new BorderPane(); 

Button b = new Button("Button"); 
ToggleButton tb = new ToggleButton("Make Button invisible"); 

b.visibleProperty().bind(tb.selectedProperty().not()); 

Button overrideBinding = new Button("Make Button invisible forever"); 
overrideBinding.setOnAction(e -> b.visibleProperty().bind(new SimpleBooleanProperty(false))); 

root.setCenter(new VBox(b, tb, overrideBinding)); 

중요 사항 : 당신이 (하여 ToggleButton 바인딩 후 처음 false)를 바인딩의 순서를 전환하면 결과는 다를 수 있습니다. 이 경우 표시 여부는 선택한 토글 상태에 따라 변경됩니다 (두 번째 토글이 첫 번째를 "덮어 씁니다").

참고 # 2 :이 일을 당신의 예에서 : 새 BooleanBinding 만드는 첫 번째 줄에

a.and(Bindings.createBooleanBinding(() -> false)); 
System.out.println(a.getValue());  

을하지만 당신은 따라서는 효과가 없습니다 어디서나에 할당하지 않습니다 a에 있습니다.

당신은 같은 결과보고를 업데이트 할 수 있습니다 :

BooleanBinding andBinding = a.and(Bindings.createBooleanBinding(() -> false)); 
System.out.println(andBinding.getValue()); 

참고 # 3 : 당신이 당신의 예에서와 같이 바인딩을 만들려고하면

a.bind(a.and(Bindings.createBooleanBinding(() -> false))); 

그것은 대부분의 아마됩니다 StackOverflowError입니다.

+0

고마워. 그러나 이것이 내가 바라는 바는 아니며,이 visibleProperty에 대한 다른 바인딩이 없을 것이라는 보장이 없기 때문입니다. 따라서 가시성을 true로 설정하는 네 번째 토글 버튼이 있으면 "보이지 않는 영원히"버튼이 더 이상 효과가 없습니다. 내가 말했듯이 바인딩을 기존의 모든 들어오는 바인딩에 concatinate해야합니다. – MarryS

+1

꽤 이상한 유스 케이스입니다. 추가 바인딩의 가능한 소스는 무엇입니까? 일반적으로 GUI 컨트롤은 노출되지 않으므로 직접 제어 할 수있는 유일한 컨트롤입니다. 그래서 나는 뒤에있는 공포를 정말로 이해하지 못합니다. 어떤 경우 든 정확한 Node를 서브 클래스 화하거나 클래스에 래핑하지 않고 "바인딩 우선 순위"를 처리 할 수 ​​있다는 것은 의심 스럽다. – DVarga

+0

@MarryS 꽤 이상한 생각이지만 항상 가시성을 false로 설정하고 다른 모든 리스너를 제거하는 changelistener를 추가 할 수 있습니다. 이 방법이 효과가 있는지는 모르겠지만 어쩌면 그 일을 할 수도 있습니다. – Clayn