JavaFX實(shí)現(xiàn)一個(gè)簡單的模態(tài)窗口
JavaFX直到目前最新的1.2.1版本里沒有提供模態(tài)窗口或著對(duì)話框,我在項(xiàng)目里通過擴(kuò)展Control自己實(shí)現(xiàn)了一個(gè)簡單的模態(tài)窗口,控件由2個(gè)類Window.fx和WindowSkin.fx組成,在WindowSkin里實(shí)現(xiàn)了Skin的抽象方法contains,在模態(tài)下始終返回true。
下面是控件的源碼和一個(gè)演示demo。
Window.fx
WindowSkin.fx

點(diǎn)擊圖片可運(yùn)行程序,非模態(tài)時(shí)背景可以監(jiān)聽到鼠標(biāo)事件。
下面是控件的源碼和一個(gè)演示demo。
Window.fx
package org.jqueen.fx.scene.control;
import javafx.scene.Node;
import javafx.scene.image.Image;
import javafx.scene.control.Control;
/**
* @author Leon Chen
*/
public class Window extends Control {
public var modal: Boolean;
public var background: Image;
public var content: Node[];
override protected function create(): Node {
skin = WindowSkin {};
super.create();
}
}
import javafx.scene.Node;
import javafx.scene.image.Image;
import javafx.scene.control.Control;
/**
* @author Leon Chen
*/
public class Window extends Control {
public var modal: Boolean;
public var background: Image;
public var content: Node[];
override protected function create(): Node {
skin = WindowSkin {};
super.create();
}
}
WindowSkin.fx
package org.jqueen.fx.scene.control;
import javafx.scene.control.Skin;
import javafx.scene.Group;
import javafx.scene.image.ImageView;
/**
* @author Leon Chen
*/
package class WindowSkin extends Skin {
def windowControl = bind control as Window;
def bounds : Bounds = bind windowControl.boundsInLocal;
def background = ImageView {
image: bind windowControl.background
};
def content = bind windowControl.content;
init {
node = Group {
content: bind[background, content]
}
}
override public function intersects(localX: Number, localY: Number, localWidth: Number, localHeight: Number): Boolean {
return bounds.intersects(localX, localY, localWidth, localHeight);
}
override public function contains(localX: Number, localY: Number): Boolean {
if (windowControl.modal) {
return true;
} else {
return bounds.contains(localX, localY);
}
}
}
import javafx.scene.control.Skin;
import javafx.scene.Group;
import javafx.scene.image.ImageView;
/**
* @author Leon Chen
*/
package class WindowSkin extends Skin {
def windowControl = bind control as Window;
def bounds : Bounds = bind windowControl.boundsInLocal;
def background = ImageView {
image: bind windowControl.background
};
def content = bind windowControl.content;
init {
node = Group {
content: bind[background, content]
}
}
override public function intersects(localX: Number, localY: Number, localWidth: Number, localHeight: Number): Boolean {
return bounds.intersects(localX, localY, localWidth, localHeight);
}
override public function contains(localX: Number, localY: Number): Boolean {
if (windowControl.modal) {
return true;
} else {
return bounds.contains(localX, localY);
}
}
}

點(diǎn)擊圖片可運(yùn)行程序,非模態(tài)時(shí)背景可以監(jiān)聽到鼠標(biāo)事件。
posted on 2009-12-19 02:45 陳維 閱讀(1958) 評(píng)論(0) 編輯 收藏 所屬分類: JavaFX