赞
踩
stage,意为舞台,实际就是一个窗口容器,与frame有点相似,但又不完全相同。
按现实生活中来说,一个表演舞台上要表演不同的主题要借助不同的背景幕布来营造意境(主题),表演的背景(主题)切换可以通过幕布的切换来完成,这就是Scene,而怎么去布局这张幕布,则是Pane类的作用,它规定了格式。例如背景中勾勒空间为天和地,画人像要先确认脸型,五官的位置。最后,在格式里的成分就是Node。例如月亮是要放在天上的,树则是长在地上的,不能反过来;以人的五官布局是要放下五个器官的……。
由此我们可以看出以下关系,一次launch可以有多个Stage对象(后面给出例子),一个Stage对象每次只能设置一个Scene对象,一个Scene对象会以一个Pane类对象为模板,而一个Pane类对象可以有多个Node类对象。
引用上个帖子的继承关系图
类型 | 属性名 | 描述 |
---|---|---|
final ObjectProperty<EventDispatcher> | eventDispatcher | 指定此节点的事件调度程序。 |
final ReadOnlyBooleanProperty | focused | 这是否具有键盘或输入焦点。Window |
final BooleanProperty | forceIntegerRenderScale | 控制是否仅缩放整数呈现的布尔属性 默认情况下由系统在 相关的输出比例。 |
final ReadOnlyDoubleProperty | height | 这个的高度.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 DoubleProperty | opacity | 将 的不透明度定义为介于 0.0 和 1.0 之间的值。Window |
final ReadOnlyDoubleProperty | outputScaleX | 将应用于水平场景的比例 渲染和合成输出的所有阶段的坐标 到屏幕或其他目标设备。Window |
final ReadOnlyDoubleProperty | outputScaleY | 将应用于垂直场景的比例 渲染和合成输出的所有阶段的坐标 到屏幕或其他目标设备。Window |
final DoubleProperty | renderScaleX | 渲染时将使用的水平比例 它到渲染缓冲区。Window Scene |
final DoubleProperty | renderScaleY | 渲染时将使用的垂直比例 它到渲染缓冲区。Window Scene |
final ReadOnlyObjectProperty<Scene> | scene | 要在此呈现的.Scene Window |
final ReadOnlyBooleanProperty | showing | 这是否显示(即,在 用户的系统)。Window |
final ReadOnlyDoubleProperty | width | 这个的宽度.Window |
final ReadOnlyDoubleProperty | x | 它在屏幕上的水平位置。Window |
final ReadOnlyDoubleProperty | y | 它在屏幕上的垂直位置。Window |
final ReadOnlyBooleanProperty | alwaysOnTop | 定义是否将其保留在其他窗口之上。Stage |
final ObjectProperty<String> | fullScreenExitHint | 指定用户进入全屏模式时要显示的文本,通常 用于指示用户应退出完全的方式 屏幕模式。 |
| fullScreenExitKey | 获取全屏退出组合键的属性。 |
final ReadOnlyBooleanProperty | fullScreen | 指定这是否应为全屏, 未装饰的窗户。Stage |
final ReadOnlyBooleanProperty | iconified | 定义是否图标化。Stage |
final DoubleProperty | maxHeight | 定义此 的最大高度。Stage |
final ReadOnlyBooleanProperty | maximized | 定义是否最大化。Stage |
final DoubleProperty | maxWidth | 定义此 的最大宽度。Stage |
final DoubleProperty | minHeight | 定义此 的最小高度。Stage |
final DoubleProperty | minWidth | 定义此 的最小宽度。Stage |
final BooleanProperty | resizable | 定义用户是否可调整大小。Stage |
final StringProperty | title | 定义 的标题。Stage |
这些属性都是在Stage的方法中才能修改。而且修改的是其内部的值
函数
| 描述 |
Stage() | 创造一个新的Stage实例 |
Stage(StageStyle style) | 创造一个规定风格的新的Stage对象实例 |
大致分为以下几类:
setxxx方法可以设置该类成员属性的成员属性的值,换言之是修改最核心的属性值而不是改变地址。setxxx方法内含对绑定的检查,属性如果绑定用setxxx方法修改就会抛出异常,这个在上章节末尾提到过,不多赘述
getxxx返回的大多也是最核心的值,一般是基本数据类型,一般用作对数据的检查。此方法不受绑定的约束。
isxxx 通常适用于是否添加了属性限制,或者检查是否触发,例如下面的代码,在放大窗口时isMax...为true。
- import javafx.application.Application;
- import javafx.scene.Group;
- import javafx.scene.Scene;
- import javafx.scene.shape.Circle;
- import javafx.stage.Stage;
-
- public class Main extends Application {
- public static void main(String[] args) {
- launch(args);
- }
-
- @Override
- public void start(Stage stage) throws Exception {
- stage.setWidth(300);
- stage.setHeight(100);
-
- Group g =new Group();
- Scene scene = new Scene(g);
- Circle circle = new Circle();
- circle.setCenterX(150);
- circle.setCenterY(50);
- circle.setRadius(20);
- g.getChildren().add(circle);
-
- circle.centerXProperty().bind(stage.widthProperty().divide(2));
- circle.centerYProperty().bind(stage.heightProperty().divide(2));
-
-
-
- stage.widthProperty().addListener((a,b,c)->{
- //System.out.println(c);
- System.out.println(stage.isFullScreen()+","+stage.isMaximized());
- System.out.println(circle.getCenterX());
-
- });
-
- stage.setScene(scene);
- stage.show();
- }
- }
得到该Stage的成员属性,常用作被动绑定(作为bind方法的形参)。注意,Stage大多只读属性无法进行主动绑定(调用bind方法)。
其中形参为枚举类,留到下面再讲
方法 | 描述 |
---|---|
initOwner(Window window) | 初始化 |
initModality(Modality modality) | 初始化模态 |
initStyle(StageStyle stagestyle) | 初始化舞台风格 |
这类方法主要是添加事件监视,做事件处理;事件监视也是之后再讲(最下面那个例外,是setxxx方法)
1.addEventHandler
为添加事件处理器;第一个形参为 事件类.常量,第二个形参为 继承 EventHandler<事件类>的匿名内部类,例子如下,添加鼠标点击事件并输出坐标。
测试代码如下:
-
- import javafx.application.Application;
- import javafx.event.EventHandler;
- import javafx.scene.Group;
- import javafx.scene.Scene;
- import javafx.scene.input.MouseEvent;
- import javafx.scene.shape.Circle;
- import javafx.stage.Stage;
-
-
-
- public class Main extends Application {
- public static void main(String[] args) {
- launch(args);
- }
-
-
- @Override
- public void start(Stage stage) throws Exception {
- stage.setWidth(300);
- stage.setHeight(100);
- //stage.initStyle();
- //stage.initOwner();
- //stage.initModality();
-
-
- Group g =new Group();
- Scene scene = new Scene(g);
- Circle circle = new Circle();
- circle.setCenterX(150);
- circle.setCenterY(50);
- circle.setRadius(20);
- g.getChildren().add(circle);
-
- circle.centerXProperty().bind(stage.widthProperty().divide(2));
- circle.centerYProperty().bind(stage.heightProperty().divide(2));
-
- EventHandler<MouseEvent> mouseEventEventHandler = mouseEvent -> {
- System.out.println(mouseEvent.getX()+","+mouseEvent.getY());
- System.out.println(mouseEvent.getScreenX());
- System.out.println(mouseEvent.getSource().getClass());
- //消耗鼠标事件,子节点不再触发。
- mouseEvent.consume();
- };
-
- /* scene.addEventHandler(MouseEvent.MOUSE_CLICKED,mouseEventEventHandler);
- stage.addEventHandler(MouseEvent.MOUSE_CLICKED,mouseEventEventHandler);*/
- scene.addEventFilter(MouseEvent.MOUSE_CLICKED,mouseEventEventHandler);
- stage.addEventFilter(MouseEvent.MOUSE_CLICKED,mouseEventEventHandler);
-
-
- stage.widthProperty().addListener((a,b,c)->{
- //System.out.println(c);
- System.out.println(stage.isFullScreen()+","+stage.isMaximized());
- System.out.println(circle.getCenterX());
-
- });
-
- stage.setScene(scene);
- stage.show();
- }
- }
Run:
2.addEventFilter
为事件过滤器,eventFilter可以使父节点为所有子节点提供通用的事件处理,或者拦截住该事件来使子节点不再响应改事件
结果:
点击两次
改为EventFilter:
点击两次,结果:
这个知识点东西很多,以后再单独讲解。
Stage类位于javafx.stage包中,当程序检测到Stage对象就会新建一个窗口,该窗口的可见性可以通过 show( ) (显现) ,hide( ) (隐藏) 来控制,从上一章我们了解到,launch的stage默认隐藏在后台,需要通过show方法来显现。通过下面的代码尝试修改Show的注释处:可以看到生成的弹窗默认也是隐藏在后台的
代码:
- import javafx.application.Application;
- import javafx.application.Platform;
- import javafx.scene.Group;
- import javafx.scene.Scene;
- import javafx.scene.control.Label;
- import javafx.scene.layout.Pane;
- import javafx.stage.Stage;
-
- public class Main extends Application {
- public static void main(String[] args) {
-
- launch(args);
- }
-
- @Override
- public void start(Stage primaryStage) throws Exception {
-
- //设置舞台大小
- primaryStage.setWidth(300);
- primaryStage.setHeight(100);
- //添加布局
- Pane p = new Pane(new Group());
- //以布局新建场景
- Scene s = new Scene(p,300,100);
- //组件
- Label l = new Label("Hello world");
- //将组件添加到布局的子节点中()
- p.getChildren().add(l);
- //舞台展示场景
- primaryStage.setScene(s);
- //设置展示
- //primaryStage.show();
- Stage EXstage1 = new Stage();
- EXstage1.setTitle("额外的弹窗");
- //设置展示
- EXstage1.show();
-
-
- /* long Tstart = System.currentTimeMillis();
- int i ;
- for(i = 0;i<5;i++){
- Thread.sleep(1000);
- System.out.println(i+1);
- }
- long TEnd = System.currentTimeMillis();
- System.out.println("timeCnt:" + (TEnd-Tstart) +"ms" );
- Platform.exit();*/
-
-
-
-
-
- }
- }
位于stage包的StageStyle枚举类,其定义如下:
DECORATED(默认) | 定义具有纯白色背景和平台装饰的普通样式 |
TRANSPARENT | 定义具有透明背景且无修饰的样式。 |
UNDECORATED | 定义具有纯白色背景且无修饰的样式。 |
UNIFIED | 使用平台装饰定义样式,并消除 客户区和装饰品 |
UTILITY | 定义具有纯白色背景和最小值的样式 用于实用窗口的平台装饰 |
样式如下:
1.DECORATED(默认)
2.TRANSPARENT(没有边框)
3.UNDECORATED(无边框)
4.UNIFIED
5.UTILITY
位于stage包的Modality枚举类,举例留到后面将组件的时候再讲。
NONE(默认) | 定义一个非模式窗口,并且不阻止任何其他窗口 |
WINDOW_MODAL | 定义一个模式窗口,该窗口阻止事件传递到其 整个所有者窗口层次结构 |
APPLICATION_MODAL | 定义一个模式窗口,阻止事件传递到任何 其他应用程序窗口 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。