当前位置: 代码迷 >> 综合 >> JavaFX API详解之Window,Stage,PopupWindow
  详细解决方案

JavaFX API详解之Window,Stage,PopupWindow

热度:14   发布时间:2023-12-26 01:17:56.0
 stage包中包含
Window, Stage, PopupWindow, Popup, FileChooser, DirectoryChooser, Screen等类。

其中Window类可理解成一个窗体,用于存放Scene,并与用户操作。一般window作为窗体,都用其子类Stage和PopupWindow。
看一下Window作为窗体的顶级类包含的一些共同属性
eventDispatcher setEventDispatcher(EventDispatcher value)
focused: 焦点集中 setFocused(boolean)设置
x y width height: 位置及大小 setX(double),setY(double),setWidth(double),setHeight(double) 设置
onCloseRequest 关闭Window事件 setOnCloseRequest(EventHandler)
onHidden 隐藏事件 setOnHidden(EventHandler)
onHiding 隐藏事件,优先于OnHidden setOnHiding(EventHandler)
onShowing 显示事件 setOnShowing(EventHandler)
onShown 显示事件,在OnShowing之后 setOnShown(EventHandler)
opacity 透明 setOpacity(double) 值为0到1
scene 设置场景 setScene(Scene)
showing 是否是显示状态 isShowing()

Window的一些方法:
addEventFilter(EventType eventType, EventHandler eventFilter) 添加事件过滤
removeEventFilter(EventType eventType, EventHandler eventFilter)
addEventHandler(EventType eventType, EventHandler eventHandler) 添加事件
removeEventHandler(EventType eventType, EventHandler eventHandler)
buildEventDispatchChain(EventDispatchChain tail)
centerOnScreen() 使Window显示中间
hide() 隐藏 实际就是关闭
show() 保护类型 显示window
requestFocus() 要求焦点集中
sizeToScene() 使Window的大小匹配它Scene的大小。如果你没有设置Window大小的话,那么就是刚好匹配的(匹配不等于相等了,window始终要大Scene一些)。若果你设置了window大小,在调用该方法,则会改变window的大小以匹配Scene大小。 最好的例子是,你设置window大小,而不设置Scene大小,再调用该方法。
fireEvent(Event event) 调用指定的事件

Stage作为顶级容器,其主Stage由系统创建。额外的可由应用程序创建。
fullScreen 是否全屏,该属性类型为ReadOnly,不可绑定。 setFullScreen(boolean) 虽然是全屏 但是width,height等属性值仍不变,若在全屏的时候改变这些值,返回原来状态的时候,使用改变后的值。
iconified 是否最小化 setIconified(boolean)
resizable 设置大小是否变化 setResizable(boolean) 为true则不能拉动stage的大小
title 设置标题
maxHeight maxWidth minHeight minWidth 设置最大最小高宽

stage的一些方法:
initModality(Modality modality) 设置stage的形态,根据功能来讲就是窗口之间的阻塞模式,该方法不能被primaryStage调用,只能被自己创建的stage调用。
Modality.NONE – a stage that does not block any other window.
不限制,父窗口与子窗口之间没阻塞
Modality.WINDOW_MODAL – a stage that blocks input events from being delivered to all windows from its owner (parent) to its root. Its root is the closest ancestor window without an owner.
阻塞父窗口,也就是子窗口出现的时候,父窗口点击不了。
Modality.APPLICATION_MODAL – a stage that blocks input events from being delivered to all windows from the same application, except for those from its child hierarchy.
这种为阻塞其它窗口,除了它的子窗口。 

initStyle(StageStyle style) 设置样式 设置样式也可以通过stage的构造函数设置
StageStyle.DECORATED – a stage with a solid white background and platform decorations.
一般的stage
StageStyle.UNDECORATED – a stage with a solid white background and no decorations.
白色背景,没有修饰
StageStyle.TRANSPARENT – a stage with a transparent background and no decorations.
透明,没有修饰
StageStyle.UTILITY – a stage with a solid white background and minimal platform decorations.
白色背景,仅一个关闭按钮

close() 关闭窗口 也就是调用父类的Hide()方法
initOwner(Window owner)指定所属的window,就相当指定父窗口。
showAndWait()调用之后会阻塞在这里,直到被hidden或closed(被调用隐藏或关闭它),才会唤醒,继续执行下面的代码。 举个例子,假如我在代码里面创建了2个stage,可是我想第一个stage关闭的时候才创建第二个,此时你就可以在第一个stage创建完后调用showAndWait()方法,当第一个被隐藏或关闭时,才会继续执行第二个stage的创建方法。
toBack() 实现在后端
toFront() 显示在前端

PopupWindow作为顶级容器,但本身是抽象类。其主要子类由Popup, 和 PopupControl。 而PopupControl并不是直接使用的空间,而是其子类ContextMenu,Tooltip。 PopupWindow可理解成弹出层,子类Popup用于自定义弹出层,ContextMenu,Tooltip为系统实现的弹出层。
PopupWindw和stage不同,它没有窗体的修饰,没有标题栏,并且不会作为顶级容器直接在操作系统上显示(一般都在stage上显示)。一般用于提醒,可移动的Box等。
看一下PopupWindow作为弹出框的顶级类所包含的一些共同属性:
autoFix
autoHide 自动隐藏,setAutoHide(boolean) 默认值为true。在焦点失去的时候会隐藏(可是什么显示却没有)。
consumeAutoHidingEvents 是否在隐藏的时候消费掉事件, setConsumeAutoHidingEvents(boolean) 也就是说调用完隐藏事件后,就消耗掉事件,不再往下传递,避免Popup的UI控件触发事件。举个例子假如你失去焦点时,PopupWindow的autoHide事件触发,同时PopupWindow的一个UI控件也触发了这个事件,此时设置consumeAutoHidingEvents为true,因为会首先调用autoHide事件,并且把这个响应事件消耗了,所以那个UI控件的事件就不会被处理了。
hideOnEscape 这个就是你按esc的时候PopupWindow是否隐藏,setHideOnEscape(boolean)
onAutoHide 自动隐藏处理事件, setOnAutoHide(EventHandler) 。 在它本身的隐藏事件后调用。
ownerNode,ownerWindow 所属的节点和窗口,只读对象。 PopupWindow显示必须指定其拥有者,所以就有该属性。
可以看它的show方法,owner可以是window,也可以是Node
show(Window owner)
show(Window ownerWindow, double screenX, double screenY)
show(Node ownerNode, double screenX, double screenY)
显示在该节点右侧:
double screenX = button.getScene().getWindow().getX() + button.getScene().getX() + button.localToScene(0, 0).getX(); 这里计算出button位于Screen中的位置,然后只需要加上Button的宽度。
double width = button.getBoundsInParent().getWidth(); 因为BoundsInParent包含button的effect效果占的位置,所以用这个比button.getWidth()好。
只要确定了button在Screen中的位置,然后PopWindow想位于button的哪里就好计算了。
button.localToScene(0, 0) 其中有二个参数,这是指Node自身以那个点作为坐标点。 举例:button以左上方点0,0作为位置计算的点,所以参数是0,0。假若是circle,则参数是circle.centerX,circle.centerY,因为circle是以中心点作为坐标点。
获取owner
getOwnerWindow()
getOwnerNode() 

再看一下PopupWindow中一些方法:
hide() 隐藏。
setScene(Scene scene) 设置scene,保护类型。PopupWindow已经创建了Scene,并指定了根节点。
getContent() 保护类型,获取根节点的ChildrenList。
看一下getContent的源码
protected ObservableList getContent() {
final Parent rootNode = getScene().getRoot();
if (!(rootNode instanceof Group)) {
throw new IllegalStateException(
“The content of the Popup can’t be accessed”);
}

return ((Group) rootNode).getChildren();
}
不难发现根节点就是Group。

一般我们要开发PopupWindow,直接使用它的子类Popup。
Popup中就一个getContent() 方法,看它的源码,就是调用了PopupWindow的getContent方法。
public final ObservableList getContent() {
return super.getContent();
}
  相关解决方案