JavaFX 舞台(JavaFX Stage)

时间:2020-01-09 10:36:41  来源:igfitidea点击:

JavaFX Stage,即javafx.stage.Stage,表示JavaFX桌面应用程序中的一个窗口。在JavaFXStage内,我们可以插入JavaFXScene,它表示在Stage内的窗口内显示的内容。

JavaFX应用程序启动时,会创建一个根目录" Stage"对象,该对象将传递到JavaFX应用程序根类的" start(Stage primaryStage)"方法。这个"阶段"对象代表JavaFX应用程序的主窗口。如果应用程序需要打开更多窗口,则可以在应用程序生命周期的稍后时间创建新的" Stage"对象。

创建一个舞台

我们可以像创建其他Java对象一样,创建JavaFXStage对象:使用new命令和Stage构造函数。这是创建JavaFXStage对象的示例。

Stage stage = new Stage();

展示舞台

简单创建JavaFXStage对象不会显示它。为了使"舞台"可见,我们必须调用其" show()"或者" showAndWait()"方法。这是显示JavaFXStage的示例:

Stage stage = new Stage();
stage.show();

show()与showAndWait()

JavaFX Stage方法show()和showAndWait()之间的区别在于,show()使Stage可见,并且立即退出show()方法,而showAndWait ()显示Stage对象,然后阻塞(停留在showAndWait()方法内部),直到Stage关闭为止。

在舞台上布置场景

为了显示JavaFXStage内的任何内容,我们必须在Stage上设置JavaFXScene对象。当显示"舞台"时,"场景"的内容将显示在"舞台"内部。这是在JavaFXStage上设置Scene的示例:

VBox vBox = new VBox(new Label("A JavaFX Label"));
Scene scene = new Scene(vBox);

Stage stage = new Stage();
stage.setScene(scene);

舞台名称

我们可以通过Stage``setTitle()方法设置JavaFXStage标题。 "舞台"标题显示在"舞台"窗口的标题栏中。这是设置JavaFXStage标题的示例:

stage.setTitle("JavaFX Stage Window Title");

舞台位置

我们可以通过JavaFXStage的setX()和setY()方法设置其位置(X,Y)。 setX()和setY()方法设置由Stage表示的窗口左上角的位置。这是设置JavaFXStage对象的X和Y位置的示例:

Stage stage = new Stage();

stage.setX(50);
stage.setY(50);

请注意,如果我们设置X和Y位置,则可能还需要设置Stage的宽度和高度,否则舞台窗口可能会变得非常小。有关设置Stage的宽度和高度的更多信息,请参见下一部分。

舞台宽度和高度

我们可以通过JavaFXStage的setWidth()和setHeight()方法设置其宽度和宽度。这是设置JavaFXStage的宽度和高度的示例:

Stage stage = new Stage();

stage.setWidth(600);
stage.setHeight(300);

舞台形态

我们可以设置JavaFXStage的窗口模式。 "阶段"模式确定代表"阶段"的窗口是否会阻止同一JavaFX应用程序打开的其他窗口。我们可以通过JavaFXStageinitModality()方法设置窗口模式。这是设置JavaFXStage模态的示例:

public class StageExamples extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX App");

        Stage stage = new Stage();
        stage.initModality(Modality.APPLICATION_MODAL);
        //stage.initModality(Modality.WINDOW_MODAL);
        //stage.initModality(Modality.NONE);

        primaryStage.show();

        stage.showAndWait();

    }
}

请注意,此示例如何是完整的JavaFX应用程序。当JavaFX应用程序启动时执行start()方法(首先调用main(),它调用launch(),之后再调用start())。

还要注意,如何创建一个新的JavaFXStage对象,设置其模态模式,然后使主要对象和新的Stage对象都可见(如图所示)。第二个"阶段"将其模态设置为" Modality.APPLICATION_MODAL",这意味着它将阻止此JavaFX应用程序打开的所有其他窗口(阶段)。在关闭此"阶段"窗口之前,我们无法访问任何其他窗口。

" Modality.WINDOW_MODAL"模态选项意味着新创建的" Stage"将阻止"拥有"新创建的" Stage"的" Stage"窗口,但仅限于此。并非应用程序中的所有窗口。请参阅下面的下一部分,以了解如何设置"舞台"的"所有者"。

Modality.NONE模态选项意味着该Stage不会阻止在此应用程序中打开的任何其他窗口。

" Modality.APPLICATION_MODAL"和" Modality.WINDOW_MODAL"模态模式对于表示"窗口"对象的"舞台"对象很有用,这些窗口起着"向导"或者"对话框"的作用,这些窗口应阻塞应用程序或者窗口,直到向导或者对话框进程由向导完成。用户。 " Modality.NONE"模态对于表示可以共存的窗口的" Stage"对象很有用,例如浏览器应用程序中的不同浏览器窗口。

舞台所有者

一个JavaFXStage可以由另一个Stage拥有。我们可以通过其" initOwner()"方法设置"舞台"的所有者。这是一个初始化JavaFXStage的所有者的示例,并将Stage的模态设置为Modality.WINDOW_MODAL

public class StageExamples extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX App");

        Stage stage = new Stage();
        stage.initModality(Modality.WINDOW_MODAL);

        stage.initOwner(primaryStage);

        primaryStage.show();

        stage.showAndWait();
    }
}

本示例将打开一个新的Stage,它将阻止拥有新创建的Stage(已设置为主级)的Stage

舞台样式

我们可以通过JavaFXStageinitStyle()方法设置样式。我们可以选择一组不同的样式:

  • DECORATED
  • UNDECORATED
  • TRANSPARENT
  • UNIFIED
  • UTILITY

装饰的"舞台"是带有OS装饰(标题栏和最小化/最大化/关闭按钮)和白色背景的标准窗口。

未修饰的"舞台"是标准窗口,没有OS装饰,但仍带有白色背景。

透明的"阶段"是未装饰的窗口,具有透明的背景。

统一的"舞台"就像一个装饰的舞台,不同之处在于装饰区域和主要内容区域之间没有边界。

实用程序"阶段"是一个经过装饰的窗口,但是装饰很少。

这是设置JavaFXStage样式的示例:

stage.initStyle(StageStyle.DECORATED);

//stage.initStyle(StageStyle.UNDECORATED);
//stage.initStyle(StageStyle.TRANSPARENT);
//stage.initStyle(StageStyle.UNIFIED);
//stage.initStyle(StageStyle.UTILITY);

实际上仅执行第一行。其余的被注释掉。它们仅在此处显示如何配置其他选项。

舞台全屏模式

我们可以通过Stage``setFullScreen()方法将JavaFXStage切换到全屏模式。请注意,除非在"舞台"上设置"场景",否则可能无法获得预期的结果(全屏模式下的窗口)。这是将JavaFX Stage设置为全屏模式的示例:

VBox vbox = new VBox();
Scene scene = new Scene(vbox);

primaryStage.setScene(scene);
primaryStage.setFullScreen(true);

primaryStage.show();