当前位置:   article > 正文

4.Stage_stage类

stage类

1. 应用体系结构简单介绍

        stage,意为舞台,实际就是一个窗口容器,与frame有点相似,但又不完全相同。

        按现实生活中来说,一个表演舞台上要表演不同的主题要借助不同的背景幕布来营造意境(主题),表演的背景(主题)切换可以通过幕布的切换来完成,这就是Scene,而怎么去布局这张幕布,则是Pane类的作用,它规定了格式。例如背景中勾勒空间为天和地,画人像要先确认脸型,五官的位置。最后,在格式里的成分就是Node。例如月亮是要放在天上的,树则是长在地上的,不能反过来;以人的五官布局是要放下五个器官的……。

        由此我们可以看出以下关系,一次launch可以有多个Stage对象(后面给出例子),一个Stage对象每次只能设置一个Scene对象,一个Scene对象会以一个Pane类对象为模板,而一个Pane类对象可以有多个Node类对象。

2. Stage 类

        引用上个帖子的继承关系图

 

2.1 Stage 的属性:

2.1.1 Window的属性:

类型属性名描述
final ObjectProperty<EventDispatcher>eventDispatcher指定此节点的事件调度程序。
final ReadOnlyBooleanPropertyfocused这是否具有键盘或输入焦点。Window
final BooleanPropertyforceIntegerRenderScale控制是否仅缩放整数呈现的布尔属性 默认情况下由系统在 相关的输出比例。
final ReadOnlyDoublePropertyheight这个的高度.Window
final ObjectProperty<EventHandler<WindowEvent>>onCloseRequest当有外部请求关闭此 .Window
final ObjectProperty<EventHandler<WindowEvent>>onHidden在隐藏窗口后调用。
final ObjectProperty<EventHandler<WindowEvent>>onHiding在隐藏窗口之前调用。
final ObjectProperty<EventHandler<WindowEvent>>onShowing在显示窗口之前调用。
final ObjectProperty<EventHandler<WindowEvent>>onShown在窗口显示后调用。
final DoublePropertyopacity将 的不透明度定义为介于 0.0 和 1.0 之间的值。Window
final ReadOnlyDoublePropertyoutputScaleX将应用于水平场景的比例 渲染和合成输出的所有阶段的坐标 到屏幕或其他目标设备。Window
final ReadOnlyDoublePropertyoutputScaleY将应用于垂直场景的比例 渲染和合成输出的所有阶段的坐标 到屏幕或其他目标设备。Window
final DoublePropertyrenderScaleX渲染时将使用的水平比例 它到渲染缓冲区。WindowScene
final DoublePropertyrenderScaleY渲染时将使用的垂直比例 它到渲染缓冲区。WindowScene
final ReadOnlyObjectProperty<Scene>scene要在此呈现的.SceneWindow
final ReadOnlyBooleanPropertyshowing这是否显示(即,在 用户的系统)。Window
final ReadOnlyDoublePropertywidth这个的宽度.Window
final ReadOnlyDoublePropertyx它在屏幕上的水平位置。Window
final ReadOnlyDoublePropertyy它在屏幕上的垂直位置。Window

2.1.2 Stage独有属性:

final ReadOnlyBooleanPropertyalwaysOnTop定义是否将其保留在其他窗口之上。Stage
final ObjectProperty<String>fullScreenExitHint指定用户进入全屏模式时要显示的文本,通常 用于指示用户应退出完全的方式 屏幕模式。

final ObjectProperty<KeyCombination>

fullScreenExitKey获取全屏退出组合键的属性。
final ReadOnlyBooleanPropertyfullScreen指定这是否应为全屏, 未装饰的窗户。Stage
final ReadOnlyBooleanPropertyiconified定义是否图标化。Stage
final DoublePropertymaxHeight定义此 的最大高度。Stage
final ReadOnlyBooleanPropertymaximized定义是否最大化。Stage
final DoublePropertymaxWidth定义此 的最大宽度。Stage
final DoublePropertyminHeight定义此 的最小高度。Stage
final DoublePropertyminWidth定义此 的最小宽度。Stage
final BooleanPropertyresizable定义用户是否可调整大小。Stage
final StringPropertytitle定义 的标题。Stage

        这些属性都是在Stage的方法中才能修改。而且修改的是其内部的值

 2.2 Stage 的构造函数:

函数
描述
Stage()创造一个新的Stage实例
Stage(StageStyle style)创造一个规定风格的新的Stage对象实例

2.3 Stage 方法:

        大致分为以下几类:

  1. set xxx
  2. getxxx
  3. isxxx
  4. xxxProperty
  5. initxxx
  6. setOnxxx
  7. eventHandler、eventFilter
  8. show,hide,close 

2.3.1 setxxx方法:

        setxxx方法可以设置该类成员属性的成员属性的值,换言之是修改最核心的属性值而不是改变地址。setxxx方法内含对绑定的检查,属性如果绑定用setxxx方法修改就会抛出异常,这个在上章节末尾提到过,不多赘述

2.3.2 getxxx方法:

        getxxx返回的大多也是最核心的值,一般是基本数据类型,一般用作对数据的检查。此方法不受绑定的约束。

2.3.3 isxxx方法:

        isxxx 通常适用于是否添加了属性限制,或者检查是否触发,例如下面的代码,在放大窗口时isMax...为true。

  1. import javafx.application.Application;
  2. import javafx.scene.Group;
  3. import javafx.scene.Scene;
  4. import javafx.scene.shape.Circle;
  5. import javafx.stage.Stage;
  6. public class Main extends Application {
  7. public static void main(String[] args) {
  8. launch(args);
  9. }
  10. @Override
  11. public void start(Stage stage) throws Exception {
  12. stage.setWidth(300);
  13. stage.setHeight(100);
  14. Group g =new Group();
  15. Scene scene = new Scene(g);
  16. Circle circle = new Circle();
  17. circle.setCenterX(150);
  18. circle.setCenterY(50);
  19. circle.setRadius(20);
  20. g.getChildren().add(circle);
  21. circle.centerXProperty().bind(stage.widthProperty().divide(2));
  22. circle.centerYProperty().bind(stage.heightProperty().divide(2));
  23. stage.widthProperty().addListener((a,b,c)->{
  24. //System.out.println(c);
  25. System.out.println(stage.isFullScreen()+","+stage.isMaximized());
  26. System.out.println(circle.getCenterX());
  27. });
  28. stage.setScene(scene);
  29. stage.show();
  30. }
  31. }

 2.3.4  xxxProperty方法:

        得到该Stage的成员属性,常用作被动绑定(作为bind方法的形参)。注意,Stage大多只读属性无法进行主动绑定(调用bind方法)。

 2.3.5 initxxx 方法:

        其中形参为枚举类,留到下面再讲

方法描述
initOwner(Window window)初始化
initModality(Modality modality)初始化模态
initStyle(StageStyle stagestyle)初始化舞台风格

 2.3.6 setOnxxx 方法:

        这类方法主要是添加事件监视,做事件处理;事件监视也是之后再讲(最下面那个例外,是setxxx方法)

  2.3.7 EventHandler /addEventFilter 方法:

        1.addEventHandler

        为添加事件处理器;第一个形参为 事件类.常量,第二个形参为 继承 EventHandler<事件类>的匿名内部类,例子如下,添加鼠标点击事件并输出坐标。

测试代码如下:

  1. import javafx.application.Application;
  2. import javafx.event.EventHandler;
  3. import javafx.scene.Group;
  4. import javafx.scene.Scene;
  5. import javafx.scene.input.MouseEvent;
  6. import javafx.scene.shape.Circle;
  7. import javafx.stage.Stage;
  8. public class Main extends Application {
  9. public static void main(String[] args) {
  10. launch(args);
  11. }
  12. @Override
  13. public void start(Stage stage) throws Exception {
  14. stage.setWidth(300);
  15. stage.setHeight(100);
  16. //stage.initStyle();
  17. //stage.initOwner();
  18. //stage.initModality();
  19. Group g =new Group();
  20. Scene scene = new Scene(g);
  21. Circle circle = new Circle();
  22. circle.setCenterX(150);
  23. circle.setCenterY(50);
  24. circle.setRadius(20);
  25. g.getChildren().add(circle);
  26. circle.centerXProperty().bind(stage.widthProperty().divide(2));
  27. circle.centerYProperty().bind(stage.heightProperty().divide(2));
  28. EventHandler<MouseEvent> mouseEventEventHandler = mouseEvent -> {
  29. System.out.println(mouseEvent.getX()+","+mouseEvent.getY());
  30. System.out.println(mouseEvent.getScreenX());
  31. System.out.println(mouseEvent.getSource().getClass());
  32. //消耗鼠标事件,子节点不再触发。
  33. mouseEvent.consume();
  34. };
  35. /* scene.addEventHandler(MouseEvent.MOUSE_CLICKED,mouseEventEventHandler);
  36. stage.addEventHandler(MouseEvent.MOUSE_CLICKED,mouseEventEventHandler);*/
  37. scene.addEventFilter(MouseEvent.MOUSE_CLICKED,mouseEventEventHandler);
  38. stage.addEventFilter(MouseEvent.MOUSE_CLICKED,mouseEventEventHandler);
  39. stage.widthProperty().addListener((a,b,c)->{
  40. //System.out.println(c);
  41. System.out.println(stage.isFullScreen()+","+stage.isMaximized());
  42. System.out.println(circle.getCenterX());
  43. });
  44. stage.setScene(scene);
  45. stage.show();
  46. }
  47. }

Run:

          2.addEventFilter

        为事件过滤器,eventFilter可以使父节点为所有子节点提供通用的事件处理,或者拦截住该事件来使子节点不再响应改事件

 

结果:

点击两次 

 改为EventFilter: 

点击两次,结果:

         这个知识点东西很多,以后再单独讲解。

2.8 Stage 的显现与隐藏

        Stage类位于javafx.stage包中,当程序检测到Stage对象就会新建一个窗口,该窗口的可见性可以通过 show( ) (显现) hide( ) (隐藏) 来控制,从上一章我们了解到,launch的stage默认隐藏在后台,需要通过show方法来显现。通过下面的代码尝试修改Show的注释处:可以看到生成的弹窗默认也是隐藏在后台的

 代码:

  1. import javafx.application.Application;
  2. import javafx.application.Platform;
  3. import javafx.scene.Group;
  4. import javafx.scene.Scene;
  5. import javafx.scene.control.Label;
  6. import javafx.scene.layout.Pane;
  7. import javafx.stage.Stage;
  8. public class Main extends Application {
  9. public static void main(String[] args) {
  10. launch(args);
  11. }
  12. @Override
  13. public void start(Stage primaryStage) throws Exception {
  14. //设置舞台大小
  15. primaryStage.setWidth(300);
  16. primaryStage.setHeight(100);
  17. //添加布局
  18. Pane p = new Pane(new Group());
  19. //以布局新建场景
  20. Scene s = new Scene(p,300,100);
  21. //组件
  22. Label l = new Label("Hello world");
  23. //将组件添加到布局的子节点中()
  24. p.getChildren().add(l);
  25. //舞台展示场景
  26. primaryStage.setScene(s);
  27. //设置展示
  28. //primaryStage.show();
  29. Stage EXstage1 = new Stage();
  30. EXstage1.setTitle("额外的弹窗");
  31. //设置展示
  32. EXstage1.show();
  33. /* long Tstart = System.currentTimeMillis();
  34. int i ;
  35. for(i = 0;i<5;i++){
  36. Thread.sleep(1000);
  37. System.out.println(i+1);
  38. }
  39. long TEnd = System.currentTimeMillis();
  40. System.out.println("timeCnt:" + (TEnd-Tstart) +"ms" );
  41. Platform.exit();*/
  42. }
  43. }

3.模态与风格

        3.1 风格

                位于stage包的StageStyle枚举类,其定义如下:

DECORATED(默认)定义具有纯白色背景和平台装饰的普通样式
TRANSPARENT定义具有透明背景且无修饰的样式。
UNDECORATED定义具有纯白色背景且无修饰的样式。
UNIFIED使用平台装饰定义样式,并消除 客户区和装饰品
UTILITY定义具有纯白色背景和最小值的样式 用于实用窗口的平台装饰

               样式如下:

                1.DECORATED(默认)

       

 

                2.TRANSPARENT(没有边框)

 

        3.UNDECORATED(无边框)

 

         4.UNIFIED 

         5.UTILITY

 

        3.2 模态

                位于stage包的Modality枚举类,举例留到后面将组件的时候再讲。

        

NONE(默认)定义一个非模式窗口,并且不阻止任何其他窗口
WINDOW_MODAL定义一个模式窗口,该窗口阻止事件传递到其 整个所有者窗口层次结构
APPLICATION_MODAL定义一个模式窗口,阻止事件传递到任何 其他应用程序窗口

                

  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/655792
推荐阅读
相关标签
  

闽ICP备14008679号