2014-01-06 4 views
4

제 어플리케이션에는 여러 독립적 인 (모달이 아닌) 스테이지가 있습니다.모든 스테이지를 앞쪽으로 가져 오십시오.

나는 다음과 같은 동작 싶습니다 기본 스테이지가 해제 최소화 될 때 주요 단계가 최소화 될 때, 다른 모든 단계는

  • 을 최소화해야

    • 을, 다른 모든 단계는-않은 최소화해야한다 단계 중 하나가 선택되면 다른 단계가 표시되어 있지 않으면
    • 는, (예를 들면 다른 애플리케이션 뒤에 숨겨), 이들은 전면

    fi의 가져온되어야 처음 두 가지 요구 사항은 (뭔가를 놓치지 않았다면) 쉽게 할 수 있습니다.

    mainStage.iconifiedProperty().addListener((observable, oldValue, newValue) -> { 
        if (newValue != null && newValue != oldValue) { 
         for (Stage s : otherStages) { s.setIconified(newValue); } 
        } 
    }); 
    

    그러나 나는 세 번째 것을 고수하고 있습니다. focusedProperty을 사용해 보았지만 작동하지 않습니다 (예를 들어, 처음에는 다른 스테이지를 앞쪽으로 가져 오기 때문에 한 단계의 메뉴를 클릭하면 초점이 사라지고 메뉴가 열리지 않습니다) ..

    세 번째 요구 사항을 구현하는 방법에 대한 아이디어가 있습니까?

  • 답변

    6

    솔루션

    사용 stage.initOwner(parentStage).

    샘플 앱

    여기에 기본 응용 프로그램 단계로 생성 된 모든 단계의 소유자를 초기화 빠른 테스트 응용 프로그램입니다.

    테스트 응용 프로그램은 Windows 7, JavaFX 8b122에서 테스트 한 모든 요구 사항을 충족하는 것 같습니다.

    import javafx.application.Application; 
    import javafx.scene.*; 
    import javafx.scene.paint.Color; 
    import javafx.scene.shape.Rectangle; 
    import javafx.stage.Stage; 
    import javafx.stage.StageStyle; 
    
    public class LotsaStages extends Application { 
        private static final Color[] STAGE_COLORS = { 
         Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW 
        }; 
        private static final double STAGE_OFFSET = 50; 
    
        @Override 
        public void start(Stage primaryStage) throws Exception { 
         addContent(primaryStage, Color.LIGHTBLUE); 
         primaryStage.show(); 
    
         double offset = STAGE_OFFSET; 
         for (Color color: STAGE_COLORS) { 
          Stage child = new Stage(); 
          child.initOwner(primaryStage); 
          child.initStyle(StageStyle.UTILITY); 
    
          child.setX(primaryStage.getX() + offset); 
          child.setY(primaryStage.getY() + offset); 
    
          addContent(child, color); 
    
          child.show(); 
    
          offset += STAGE_OFFSET; 
         } 
        } 
    
        private void addContent(Stage child, Color color) { 
         child.setScene(
          new Scene(
           new Group(
            new Rectangle(150, 70, color) 
           ) 
          ) 
         ); 
        } 
    
        public static void main(String[] args) { launch(args); } 
    } 
    

    는 테스트 응용 프로그램은 매우 간단하고 나는 메뉴를 기반으로 문제를 복제하려고하지 않았다, 그래서 메뉴 기반 처리 또는 당신이 할 수있는 다른 요구 사항에 정확하게 전달합니다 있는지 확실하지 않습니다.

    추가 질문

    그래서 기본적으로 initOwner "링크"메인 무대에 아이들?

    예, MSDN explains how window ownage works on Windows입니다. 다른 플랫폼에서는 동작이 약간 다를 수 있습니다 (JavaFX Javadoc이 의도적으로 모호한 이유). 그러나 대부분의 원리는 동일하며 OS X 및 Linux에서 작동해야합니다. 비슷한 방식입니다. MSDN에서

    :

    당신이 자식 창과 부모 창 사이의 관계를 만들 수 있도록하려면, 윈도우는 소유의 개념을 지원합니다. 소유권은 창의 소유 자 속성 (소유 된 윈도우)이 다른 윈도우 (소유자 윈도우)에 대한 참조로 설정 될 때 설정됩니다.

    는이 관계가 설정되면 다음과 같은 동작이 전시되어 있습니다 : 소유자 창을 최소화

    • 경우, 모든 소유 창문도 최소화됩니다.
    • 소유 된 창이 최소화 된 경우 소유자가 최소화되지 않습니다.
    • 소유자 창이 최대화되면 소유자 창과 소유 된 창 모두 복원됩니다.
    • 소유자 창이 소유 된 창을 절대 커버 할 수 없습니다.
    • ShowDialog를 사용하여 열지 않은 소유 창은 모달이 아닙니다. 사용자는 여전히 소유자 창과 상호 작용할 수 있습니다.
    • 소유자 창을 닫으면 소유 된 창도 닫힙니다.
    • 소유권있는 윈도우가 소유자 윈도우에서 표시를 사용하여 열렸으며 소유자 윈도우가 닫힌 경우 소유 된 윈도우의 닫기 이벤트가 발생하지 않습니다.

    ShowDialog를 호출하여 하위 창을 열면 하위 창의 소유자 속성도 설정해야합니다. 그렇지 않은 경우 사용자는 작업 표시 줄 버튼을 눌러 하위 창과 상위 창을 모두 복원 할 수 없습니다. 대신, 작업 표시 줄 단추를 누르면 선택할 수있는 창과 부모 창이 모두 포함 된 창 목록이 표시됩니다. 선택한 창만 복원됩니다.


    수 있도록 child = new Stage(UNDECORATED); child.initModality(Modality.NONE); 같은 아이들과 함께 사용할 수 있습니까?

    예. 오라클 문서 https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Stage.html#initOwner-javafx.stage.Window- "A 단계는 선택적으로 소유자를 가질 수에서

    +0

    창 : 스테이지의 소유자 인 경우 해당 스테이지의 부모라고 말합니다. 부모 창이 닫히면 모든 자손 창이 닫히고 아이콘 화 된 상위 창이 동일한 체인 비헤이비어가 적용됩니다. 스테이지가 보이기 전에 소유자를 초기화해야합니다. " – Linuslabo

    관련 문제