Java 如何立即更改背景?

Java 如何立即更改背景?,java,javafx,Java,Javafx,在下面的代码中,窗格的背景色只有在输入之后才会改变,而不是之前。我不明白为什么:据我所知,程序应该在sc.next()行之后才开始等待输入。有没有办法强制改变背景?在等待输入之前执行它 import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.layout.Background; import javafx.scene.l

在下面的代码中,窗格的背景色只有在输入之后才会改变,而不是之前。我不明白为什么:据我所知,程序应该在
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);
    }
}
sc.next()
的调用将被阻止,直到用户提供输入。由于
start()
方法是在FX应用程序线程上执行的,FX应用程序线程是用于呈现UI的线程,因此在释放此块之前,无法呈现UI

我们真的不清楚为什么要在GUI应用程序中读取标准输入;GUI应用程序的全部要点是为用户提供控件(文本字段、按钮等)以提供输入

如果出于某种原因确实想从标准输入中读取,则需要在后台线程中执行此操作:

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,因此如果您想在UI中使用输入,则需要进一步的代码,以便在FX应用程序线程上进行UI更改。

最有可能(因为
sc.next()
是一个阻塞调用)您正在阻止事件分派线程。@TimothyTruckle实际上是FX应用程序线程。Event Dispatch Thread是AWT和Swing用于呈现这些UI并在其上处理事件的线程的名称。