JavaFX实现一个简单的模态窗口

本文介绍了在JavaFX中如何自行实现模态窗口。通过扩展Control类并利用自定义Skin来控制窗口的行为,作者提供了完整的源码示例,展示了如何使窗口在模态状态下始终保持焦点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaFX直到目前最新的1.2.1版本里没有提供模态窗口或着对话框,我在项目里通过扩展Control自己实现了一个简单的模态窗口,控件由2个类Window.fx和WindowSkin.fx组成,在WindowSkin里实现了Skin的抽象方法contains,在模态下始终返回true。

下面是控件的源码和一个演示demo。

Window.fx

<!-- {cps..1}--> package org.jqueen.fx.scene.control;

import javafx.scene.Node;
import javafx.scene.image.Image;
import javafx.scene.control.Control;

/**
*
@author LeonChen
*/
public class Window extends Control{

public varmodal:Boolean;
public varbackground:Image;
public varcontent:Node[];

override
protected functioncreate():Node{
skin
= WindowSkin{};
super .create();
}
}


WindowSkin.fx

<!-- {cps..2}--> package org.jqueen.fx.scene.control;

import javafx.scene.control.Skin;
import javafx.scene.Group;
import javafx.scene.image.ImageView;

/**
*
@author LeonChen
*/
package class WindowSkin extends Skin{

defwindowControl
= bindcontrolasWindow;
def bounds : Bounds = bind windowControl.boundsInLocal;
def background = ImageView {
image: bind windowControl.background
};

defcontent
= bindwindowControl.content;

init{
node
= Group{
content:bind[background,content]
}
}

override
public functionintersects(localX:Number,localY:Number,localWidth:Number,localHeight:Number):Boolean{
return bounds .intersects(localX,localY,localWidth,localHeight);
}

override
public functioncontains(localX:Number,localY:Number):Boolean{
if (windowControl.modal){
return true ;
}
else {
return bounds .contains(localX,localY);
}
}
}


点击图片可运行程序,非模态时背景可以监听到鼠标事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值