当前位置: 首页 > 知识库问答 >
问题:

JavaFX:弹出窗口的鼠标事件(ControlsFX)

姬衡
2023-03-14

我有以下代码来显示Popover(自定义PopUpbyControlsFX-mvn repo)

public class JavaFXApplication35 extends Application {

    @Override
    public void start(Stage primaryStage) {
        try {

            Label lblName = new Label("Tetsing name");
            Label lblStreet = new Label("Some street name");
            Label lblCityStateZip = new Label("Some city, 111111");
            VBox vBox = new VBox(lblName, lblStreet, lblCityStateZip);

            PopOver popOver = new PopOver(vBox);

            Label label = new Label("Mouse mouse over me");

            label.setOnMouseEntered(mouseEvent -> {
                popOver.show(label, -3);
            });

            label.setOnMouseExited(mouseEvent -> {
                if (popOver.isShowing()) {
                    popOver.hide();
                }
            });

            StackPane root = new StackPane();
            root.getChildren().add(label);

            Scene scene = new Scene(root, 300, 250);

            primaryStage.setTitle("Hello World!");
            primaryStage.setScene(scene);
            primaryStage.setOnCloseRequest((WindowEvent event) -> {
                System.exit(0);
            });
            primaryStage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}

问题是,

>

  • 我希望在鼠标输入Label时显示弹出窗口-工作正常。

    我希望在用户从标签退出鼠标时隐藏弹出窗口,但在弹出窗口中输入鼠标时不隐藏弹出窗口。

    我已经在标签上添加了鼠标插入和鼠标退出操作,但如何处理另一种情况,即如果用户输入鼠标进入弹出窗口,我不想隐藏弹出窗口。

  • 共有2个答案

    岑光熙
    2023-03-14

    这可能是预期的行为。我不确定,但这里有一个解决方法。您可以使用切换按钮

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.control.ToggleButton;
    import javafx.scene.layout.StackPane;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    import org.controlsfx.control.PopOver;
    
    public class App extends Application
    {
    
        @Override
        public void start(Stage primaryStage)
        {
            //Build PopOver look and feel
            Label lblName = new Label("John Doe");
            Label lblStreet = new Label("123 Hello Street");
            Button lblCityStateZip = new Button("MadeUpCity, XX 55555");
            VBox vBox = new VBox(lblName, lblStreet, lblCityStateZip);
            //Create PopOver and add look and feel
            PopOver popOver = new PopOver(vBox);
    
            ToggleButton toggleButton = new ToggleButton("Click me!");
            toggleButton.selectedProperty().addListener((obs, oldValue, newValue) -> {
                if (newValue) {
                    popOver.show(toggleButton);
                }
                else {
                    popOver.hide();
                }
            });
            ;
    
            StackPane root = new StackPane();
            root.getChildren().add(toggleButton);
            var scene = new Scene(root, 500, 500);
            primaryStage.setTitle("Hello World!");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args)
        {
            launch(args);
        }
    }
    
    江天宇
    2023-03-14

    我遇到了同样的问题。这是我的解决方案。只需将标签(或其他节点)和PopOver的内容节点作为参数传递给此方法。

    public static void addAutoHidingPopOver(Node hoverableNode, Node contentNode) {
       //Creating PopOver
       PopOver popOver = new PopOver(hoverableNode);
       popOver.setContentNode(contentNode);
       //Here you can set custom parameters of your PopOver
       //...
    
       //Mouse Actions handling
       final Timeline timeline = new Timeline();
       timeline.getKeyFrames().add(new KeyFrame(Duration.millis(1000)));
       timeline.setOnFinished(finishEvent -> {
            if (hoverableNode.isHover() || contentNode.isHover()) timeline.play();
            else popOver.hide();
       });
       hoverableNode.setOnMouseEntered(mouseEvent -> {if (!popOver.isShowing()) popOver.show(hoverableNode);});
       hoverableNode.setOnMouseExited(mouseEvent -> timeline.play());
    }
    
    

    鼠标离开hoverableNode或contentNode后1秒,弹出窗口将隐藏。使用方法如下:

    addAutoHidingPopOver(someLabel, someContentNode);
    

    请注意,您的内容节点应该占用PopOver的所有可见空间,以便舒适地使用。

     类似资料:
    • 我目前有以下的类: 老实说,代码并不重要,请相信我,当用户将鼠标悬停在我的< code>Item对象上时,它会显示一个弹出窗口,如下所示: 这个弹出窗口在我的屏幕中间打开。如果我移动窗口,弹出窗口将在同一位置打开。我需要我的弹出窗口以某种方式在鼠标指针下打开。我知道具有此功能(据称),但我已经致力于设计这个,它具有我的许多设计目标。 这有可能让显示在某个位置吗? 谢谢。

    • 我想在单击“注册”按钮时打开一个弹出对话框。我想在弹出对话框中添加文本字段,密码字段等元素。如果您可以建议我如何将组件添加到弹出窗口,然后将弹出窗口添加到窗格并显示它,那就更好了。谢谢!。

    • 嗨,我有javafx应用程序,它只有一个stage.On标签键按下文本字段的事件,一个弹出窗口显示在应用程序的主要阶段 我不点击弹出窗口,也不选择弹出窗口中的任何内容。我会点击它后面的舞台。我希望popup被关闭,但在执行popup的focusedProperty侦听器之前,它给了我IllegalArgumentException。 如果popup位于不同的阶段(应用程序的主阶段除外),根据阶段f

    • 我想制作一个JavaFX应用程序,它基本上用对象覆盖整个用户屏幕,因此基本上我可以在用户屏幕上绘制任何东西。 制作一个覆盖整个屏幕的窗口很简单。使其本质上透明可以通过本教程实现:https://assylias.wordpress.com/2013/12/08/383/ 所以唯一阻止我的是这样一个事实,尽管窗口是透明的,但它仍然会捕获用户的鼠标和按键事件。 有什么办法可以做到这一点吗?举一个更具体

    • 问题内容: 是否有任何东西可以让您在Swing JTextArea中的单个单词或字母上显示一个小的文本弹出窗口(如工具提示)?(或具有类似功能的JTextArea替代品。) 我需要的行为就像一个工具提示,换句话说,只有在鼠标悬停在单词上一两秒钟后,才会​​显示弹出文本,并且一旦鼠标移开它就会自动消失。当然,这里最棘手的部分是我希望它在文本中的字符/单词级别,而不是组件级别……有什么建议吗? 问题答

    • 我想要一个舞台,是相同的大小,屏幕是完全透明的,接收鼠标事件在任何地方。在下面的示例中,我只在鼠标位于圆圈上方时才获得鼠标事件。我在使用Java 8U11的Windows XP和Windows 7上都看到了这个问题 有趣的是,如果我将填充颜色的alpha部分设置为它的绝对最小值,那么我会得到鼠标事件。然而,我不想使用这个变通方法,而是要真正深入到问题的底部。我的结论是,在JavaFX或Window