如何在JavaFX中实现“上下文菜单” 模式的控件?

2 篇文章 0 订阅

“上下文菜单”模式的控件需要有下面的行为特征:
当鼠标在窗口外部点击时,或者控件失去焦点、被 deacitvated 时,应该自动关闭。

其他GUI框架中,这种特性可以响应 deactivated event 来实现,但 JavaFX 的 window/stage 并没有这个事件。

但 JavaFX 中有一个特殊的类,PopupWindow 及其子类 Popup 可以用来实现这个功能。

查看 PopupWindow 的代码可以发现,原来 Window 类中有一个 increaseFocusGrabCounter() 函数,可以强制获取焦点,但可惜的是这个类是 package 访问权限,外部的使用者无法调用。

示例代码

package javafx;

import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Popup;
import javafx.stage.Stage;

public class PopupWindowExample extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        TextField textField = new TextField("显示popup");
        primaryStage.setScene(new Scene(new VBox(textField)));
        primaryStage.setWidth(500);
        primaryStage.setHeight(600);
        textField.setOnMouseClicked(event -> {
            Popup popup = new Popup();
            VBox vbox = new VBox(new CheckBox("左高低"),
                    new CheckBox("左高低"), new CheckBox("左高低")
            );
            vbox.setStyle("-fx-background-color: lightgreen");
            popup.getContent().add(vbox);
            popup.setAutoHide(true);
            Point2D screenLoc = textField.localToScreen(0, textField.getHeight() + 5);
            popup.show(primaryStage, screenLoc.getX(), screenLoc.getY());
        });
        primaryStage.show();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值