2017-09-22 9 views
3

JavaFX 응용 프로그램 스레드에서 메서드 실행을 일시 중지하고 사용자가 UI와 상호 작용할 때까지 기다리고 싶습니다. UI를 고정시키지 않는 것이 중요합니다.showAndWait을 사용하지 않고 JavaFX 응용 프로그램 스레드에서 사용자 입력을 기다리는 방법?

예 :

Button start = ... 
Button resume = ... 

start.setOnAction(evt -> { 
    System.out.println("starting"); 
    start.setDisable(true); 
    System.out.println("please press resume button."); 
    pause(); 
    System.out.println("done"); 
    start.setDisable(false); 
}); 

resume.setOnAction(evt -> resume()); 

은 어떻게 pause()resume() 메소드를 구현해야합니까?
이벤트 처리기의 실행은 사용자가 resume 버튼을 누르고 resume 메서드가 호출 될 때까지 pause(); 호출을 기다려야합니다.

+0

실제로 메서드 실행 내에서 '일시 중지'해야합니까? 그냥 'pause()'를 호출하는 대신 메서드를 끝내고 나머지는 재개 버튼의 액션 핸들러에서 처리하십시오. – isnot2bad

답변

2

당신은 실행을 재개 할 이벤트 핸들러와 (자바 FX 9부터 사용 가능) Platform.exitNestedEventLoop의 실행을 일시 정지 Platform.enterNestedEventLoop를 사용하여 수행 할 수 있습니다 : Platform.exitNestedEventLoop 통과 같은 매개 변수와 함께 호출 될 때

private final Object PAUSE_KEY = new Object(); 

private void pause() { 
    Platform.enterNestedEventLoop(PAUSE_KEY); 
} 

private void resume() { 
    Platform.exitNestedEventLoop(PAUSE_KEY, null); 
} 

Platform.enterNestedEventLoop 반환 첫 번째 인수로.

+0

'Platform.enterNestedEventLoop'는 멱등 (idempotent)입니까, 아니면 호출이 누적됩니까? 특히,'Platform.enterNestedEventLoop (...)'이 호출되고 동일한 매개 변수로 중첩 된 루프에서 호출되면, (동일한 매개 변수로)'Platform.exitNestedEventLoop'에 대한 첫 번째 호출이 두 블록을 모두 해제하거나 그렇지 않습니다 중첩 된 이벤트 루프의 블록 만 릴리스합니다 (원래 블록을 해제하기 위해 두 번째 호출이 필요함). –

+1

@James_D 중첩 루프가 종료되기 전에 동일한 키를 'enterNestedEventLoop'과 함께 두 번 이상 사용하는 것은 허용되지 않습니다. 「javadoc : * IllegalArgumentException - 지정된 키가, 아직 돌려 주어지지 않은 상자의 이벤트 루프에 관련 지을 수 있고있다」(「http://download.java.net/java/jdk9」를 참조),'IllegalArgumentException'가 슬로우됩니다. /jfxdocs/javafx/application/Platform.html#enterNestedEventLoop-java.lang.Object-) – fabian

+0

그리고 Java9 이전에? :) – user1803551