2017-12-27 13 views
0

JavaFX (Swing에서 제공)에 다소 익숙하며 내부에 여러 개의 fxml 서브 패널이있는 StackPanes를 사용하는 경향이 있습니다.이 중 하나는 특정 버튼 클릭 또는 메뉴 선택에서 toFront()로 가져옵니다. 페이드 아웃/페이드 인 전환으로 애니메이션을 만들 수 있습니까? 나는 이틀 동안 인터넷 검색을 해왔지만이 특별한 경우와 관련된 것을 찾을 수는 없다.StackPane 내부에서 자식을 toFront()로 보낼 때 페이드 전환을 적용 할 수 있습니까?

답변

0

toFront() 노드를 부모의 자식 목록의 끝으로 이동하면됩니다 (자식 목록의 순서에 따라 z 순서가 결정됨). 따라서 "최전방 노드"는 목록의 끝에있는 것입니다. Bindings.valueAt(...)Bindings.size(...)의 조합을 사용하여이 노드를 포함하는 관찰 가능 값을 만들 수 있습니다.

ObjectBinding<Node> frontNode = Bindings.valueAt(stackPane.getChildren(), 
    Bindings.size(stackPane.getChildren()).subtract(1)); 

또는 대안 구현 :.

ObjectBinding<Node> frontNode = new ObjectBinding<Node>() { 

    { bind(stackPane.getChildren()); } 

    @Override 
    protected Node computeValue() { 
     if (stackPane.getChildren().isEmpty()) return null ; 
     return stackPane.getChildren().get(stackPane.getChildren().size() - 1) ; 
    } 
} 

그런 다음 당신은 단지 이전 값을 페이드 아웃하고 새로운 가치를 페이드 리스너를 등록 할 수 있습니다 다음은 당신의 출발점을 제공한다 당신은 일할 수 있습니다.

frontNode.addListener((obs, oldNode, newNode) -> { 
    SequentialTransition fadeOutIn = new SequentialTransition(); 
    if (oldNode != null) { 
     FadeTransition fadeOut = new FadeTransition(Duration.seconds(1), oldNode); 
     fadeOut.setToValue(0); 
     fadeOutIn.getChildren().add(fadeOut); 
    } 
    if (newNode != null) { 
     FadeTransition fadeIn = new FadeTransition(Duration.seconds(1), newNode); 
     fadeIn.setFromValue(0); 
     fadeIn.setToValue(1); 
     fadeOutIn.getChildren().add(fadeIn); 
    } 
    fadeOutIn.play(); 
}); 

응용 프로그램에서 설정하는 방법에 따라 모든 스택 창 하위의 불투명도를 0으로 초기화해야 할 수 있습니다.

이 모든 코드 요구 사항은 스택 창에 대한 참조입니다.

+0

코드를 사용해 주셔서 감사합니다. 알아내는 데 다소 시간이 걸렸습니다. 제가 말했듯이, 저는 여전히 JavaFX를 처음 접했습니다. 그러나, 나는이 방법을 시도하고 일관되게 작동하지 않았다. 일부 실행에서는 버튼 핸들러 내부의 모든 앞면이 청취자를 트리거하고 페이드가 작동하지만 다른 실행에서는 하나 또는 두 개의 버튼을 클릭 한 후 작동을 멈 춥니 다. – Joe1962

+0

Dang, 코멘트가 너무 짧아 위에서 계속하기 : 그래서 나는 아이디어를 가져 와서 버튼이 처리되는 컨트롤러 레벨에서 구현했다. 클래스 레벨에서 fadeIn과 fadeOut을 설정하고 각 버튼 액션 안에서 사용했다. 지금부터 아이들은 이미 불투명도 0으로 시작합니다. 여분이 필요했던 것은 현재 자식 노드에 대한 참조 였으므로 새 자식 노드가 페이드 아웃되기 전에 페이드 아웃 될 수있었습니다. 아, 그리고 fadeIn은 fadeOut.setOnFinished 핸들러 (핸들러를 취소하기 위해 fadeOut.setOnFinished (null)로 끝남) 안에 넣어야했습니다. – Joe1962

+0

@ Joe1962 "다른 실행에서는 한 번 또는 두 번 단추를 클릭 한 후에 작동을 멈 춥니 다." 아마도 [this] (http://tomasmikula.github.io/blog/2015/02/10/the-trouble-with-weak-listeners.html)에 실 렸을 것입니다. 'frontNode' 바인딩을 로컬 변수 대신에 인스턴스 변수로 만들면, 그것을 수정해야합니다. –