天天看點

JavaFX學習之道:JavaFX API詳解之Window,Stage,PopupWindow

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();

}

其中有些方法,沒使用過,了解有點模糊,就沒寫,知道的大家評論下,互相學習。

繼續閱讀