首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在工具提示代码中无限触发两个鼠标事件的奇怪行为

问在工具提示代码中无限触发两个鼠标事件的奇怪行为
EN

Stack Overflow用户
提问于 2012-02-07 22:49:37
回答 2查看 1.2K关注 0票数 5

我正在尝试使用javafx.stage.Popup实现一个自定义的工具提示。示例演示代码如下:

代码语言:javascript
复制
public class PopupDemo extends Application {

    private Popup tooltip;
    private final SepiaTone sepiaTone = new SepiaTone();

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("PopupDemo");

        Label content = new Label();
        content.setStyle("-fx-background-color:#FCFBBD; -fx-padding: 5; -fx-border-color: #BFBD3B");

        tooltip = new Popup();
        tooltip.getContent().add(content);

        VBox vbox = new VBox(10);
        for (int i = 0; i < 5; i++) {
            final Label lbl = new Label("item " + i);
            lbl.setStyle("-fx-border-color:darkgray; -fx-background-color:lightgray");
            lbl.setMaxSize(80, 60);
            lbl.setMinSize(80, 60);
            lbl.setAlignment(Pos.CENTER);

            lbl.setOnMouseEntered(new EventHandler<MouseEvent>() {

                @Override
                public void handle(final MouseEvent e) {
                    lbl.setEffect(sepiaTone);
                    lbl.setStyle("-fx-cursor: hand");
                    Label content = (Label) tooltip.getContent().get(0);
                    content.setText(lbl.getText());
                    tooltip.show(lbl, e.getScreenX(), e.getScreenY());
                }
            });
            lbl.setOnMouseExited(new EventHandler<MouseEvent>() {

                @Override
                public void handle(MouseEvent e) {
                    lbl.setEffect(null);
                    lbl.setStyle("-fx-cursor: default");
                    tooltip.hide();
                }
            });

            vbox.getChildren().add(lbl);
        }

        StackPane root = new StackPane();
        root.setPadding(new Insets(20));
        root.getChildren().add(vbox);
        primaryStage.setScene(new Scene(root, 600, 400));
        primaryStage.show();
    }
}

当我将鼠标移到标签上时,弹出窗口就会出现,它工作得很好。但在某些情况下,两个鼠标事件处理程序OnMouseEntered和OnMouseExited会被一个接一个地连续调用。可以通过运行提供的示例、最大化窗口和连续悬停标签来重现此情况。

有没有办法避免这种情况?我使用的是JavaFX 2.0.1。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-08 05:38:51

这是一个经典的问题:你将鼠标放在一个点上,节点收到MouseEntered -工具提示出现在鼠标下方,并覆盖触发MouseExited的节点。

为了避免这种情况,您可以将tooltip.show(lbl, e.getScreenX(), e.getScreenY())调用更改为

代码语言:javascript
复制
tooltip.show(lbl, e.getScreenX() + 1, e.getScreenY() + 1);
票数 7
EN

Stack Overflow用户

发布于 2012-02-08 04:48:24

这不是一个真正的答案,而是指向您可能会尝试或进一步调查的事情的指针。

您可以查看Tooltip Skin和Behavior的实现,以了解它是如何处理其中一些情况的。

实现自定义弹出窗口的最简单方法就是使用工具提示,按照您需要的方式设置它的样式,然后使用工具提示的setGraphic method来添加您想要的任何自定义节点内容。

如果您更喜欢使用自己的实现,我认为您需要跟踪弹出窗口是否已经显示,因此如果弹出窗口已经显示,则不要试图显示它,等等。您可能还需要通过在弹出窗口本身上安装鼠标退出处理程序来调用弹出窗口的隐藏。您可能还希望通过在弹出窗口上实现鼠标单击处理程序来取消弹出窗口的单击功能。您还应该考虑是否应该直接使用Popup或PopupControl的子类,尽管使用Popup可能会更简单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9178329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档