2017-12-30 9 views
0

아래 코드에서 창 배경색은 이후에만 적용되고 이후는 변경되지 않습니다. 그리고 나는 이유를 이해할 수 없다 : 내가 아는 한, 프로그램은 라인 sc.next(); 다음에 입력을 기다리기 시작해야한다. 배경 변경을 강제하는 방법이 있습니까? 입력을 기다리기 전에 수행하려면?배경을 즉시 바꾸는 방법?

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.layout.Background; 
import javafx.scene.layout.BackgroundFill; 
import javafx.scene.layout.CornerRadii; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

import java.util.Scanner; 

public class NewMain extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     Pane pane = new Pane(); 
     primaryStage.setScene(new Scene(pane, 300, 300)); 
     primaryStage.show(); 

     pane.setBackground(new Background(new BackgroundFill(Color.BLACK, CornerRadii.EMPTY, Insets.EMPTY))); 

     Scanner sc = new Scanner(System.in); 
     String str = sc.next(); 
     System.out.println(str); 
    } 


    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+1

(sc.next()는 * 차단 호출 *이므로) * 이벤트 발송 스레드 *를 차단하고있을 가능성이 큽니다. –

+0

@TimothyTruckle 실제로 * FX 응용 프로그램 스레드 *. Event Dispatch Thread는 AWT와 Swing이 UI를 렌더링하고 이벤트를 처리하기 위해 사용하는 스레드의 이름입니다. –

답변

1

sc.next()에 대한 호출은 사용자가 입력을 제공 할 때까지 차단됩니다. start() 메서드는 UI를 렌더링하는 데 사용되는 스레드 인 FX 응용 프로그램 스레드에서 실행되므로 UI ​​렌더링은이 블록을 릴리스해야만 발생합니다.

어쨌든 GUI 응용 프로그램의 표준 입력에서 읽는 이유는 분명하지 않습니다. GUI 애플리케이션의 요점은 사용자가 입력을 제공하는 컨트롤 (텍스트 필드, 버튼 등)을 제공한다는 것입니다. 당신이 정말로 어떤 이유로 표준 입력에서 읽고 싶다면

, 당신은 백그라운드 스레드에서 그렇게 할 필요가있을 것이다 : 그렇다면 당신이 배경 스레드에서 UI를 업데이트 할 수 없습니다

public void start(Stage primaryStage) { 
    Pane pane = new Pane(); 
    primaryStage.setScene(new Scene(pane, 300, 300)); 
    primaryStage.show(); 

    pane.setBackground(new Background(new BackgroundFill(Color.BLACK, CornerRadii.EMPTY, Insets.EMPTY))); 

    Thread thread = new Thread(() -> { 
     Scanner sc = new Scanner(System.in); 
     String str = sc.next(); 
     System.out.println(str); 
    }); 
    thread.start(); 
} 

참고 UI에서 입력을 사용하려면 FX 응용 프로그램 스레드에서 UI 변경이 이루어 지도록 추가 코드가 필요합니다.

관련 문제