窗体和场景

JavaFX中,有StageScene这两个重要概念,我们这里详细了解一下。

Stage 舞台

Stage说白了就是一个窗口,我们的JavaFX工程会默认有一个Stage,我们通过继承javafx.application.Application实现的start()抽象方法传递给我们,这个Stage一般是我们应用程序交互的入口点。

@Override
public void start(Stage stage) throws IOException {
  ...
}

当然,我们可以任意实例化一个新窗口,然后调用show()让其显示。

Stage newStage = new Stage();
newStage.setTitle("新窗口");
newStage.show();

如果默认Stage已经显示了,我们又实例化了一个Stage并让其显示,此时就会同时有两个没有任何关联的窗口存在,这通常不是我们想要的。

我们可以通过设置父窗口让这两个窗口关联起来,这样Windows任务栏也只会显示一个窗口了。

newStage.initOwner(stage);

两个窗口有关联,我们才能设置模态窗口等属性,例如;

newStage.initModality(Modality.APPLICATION_MODAL);

Scene 场景

我们知道Unity中游戏的一个个地图其实就是一个个Scene,JavaFX中的Scene也是差不多意思,只不过是游玩的场景变成了UI组件树。一个Scene可以容纳一个UI组件树,Scene加载到Stage中进行显示。

但不同的是,JavaFX设计上一个Stage只能固定加载一个Scene,如果想要动态改变界面,我们只能改变Scene中的UI组件树结构,切换整个Scene虽然也能实现,但可能会有黑屏而且缺乏动画效果的支持,不知道这里设计者是怎么想的,解耦了Stage和Scene却又没真正利用上解耦的好处。

初始化并加载Scene:

Parent loginRoot = FXMLLoader.load(getClass().getResource("/fxml/Login.fxml"));
Scene loginScene = new Scene(loginRoot);
stage.setScene(loginScene);

上面我们加载的fxml其实就是一个组件树,我们甚至可以直接用Java代码实例化一个Pane布局容器加载到Scene中。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。