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

JavaFx阻止新窗口窃取焦点

韩恺
2023-03-14

JavaFX有一个问题,当我弹出一个新阶段时,该新窗口将从具有当前焦点的任何Windows应用程序中获取焦点

我希望它弹出到前面,但不对焦,所以如果用户在其他地方打字,他们可以继续打字等。

在Swing中,您可以通过以下方式解决此问题:

    dialog.setFocusable(false);
    dialog.setVisible(true);
    dialog.setFocusable(true);

JavaFx中似乎没有类似的选项。

下面的例子,当你点击按钮时,它将弹出一个新的阶段,获得焦点(注意,我不想要求焦点回来,因为在真正的应用程序中,当弹出发生时,用户可能正在写电子邮件或在网页上,它需要不从这些活动中获得焦点)

        import javafx.application.Application; 
        import javafx.scene.Scene;
        import javafx.scene.control.Button;
        import javafx.stage.Stage;

    public class Main extends Application {

        private Stage stage;

        @Override public void start(Stage stage) {
            this.stage = stage;
            stage.setTitle("Main Stage");
            stage.setWidth(500);
            stage.setHeight(500);


            Button btnPopupStage = new Button("Click");
            btnPopupStage.setOnMouseClicked(event -> popupStage());
            Scene scene = new Scene(btnPopupStage);

            stage.setScene(scene);
            stage.show();
        }

        private void popupStage(){
            Stage subStage = new Stage();
            subStage.setTitle("Sub Stage");
            subStage.setWidth(250);
            subStage.setHeight(250);
            subStage.initOwner(stage);
            subStage.show();
            System.out.println("Does main stage have focus : "+stage.isFocused());
            System.out.println("Does popup have focus : "+subStage.isFocused());
        }

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

对于stage不要把焦点放在stage.show()上有什么想法?谢谢

共有2个答案

袁山
2023-03-14

为了防止你所描述的内容,假设是你问题的原因,那么你需要添加 subStage.initModality(Modality.NONE); 。但这不是问题,其实这里没有问题看这里

stage.setWidth(500); // your stage is 500 wide
stage.setHeight(500); // & 500 long
Scene scene = new Scene(btnPopupStage);// your scene has a parent which is button
//by inheritance if i should say your button is 500 wide & long. 

你看到问题了吗?您的按钮将始终响应单击事件,这将创建一个新的舞台,因此将重点放在那个舞台

朱丰
2023-03-14

以防万一有人正在搜索,我找不到解决方案,但我找到了一个有同样问题的人,他为openjdk https://bugs.openjdk.java.net/browse/JDK-8090742

不幸的是,为了解决这个问题,我将JavaFX窗格放在Swing JFrame中,并调用了

dialog.setFocusableWindowState(false);
dialog.setVisible(true);
dialog.setFocusableWindowState(true);

这已经解决了焦点窃取问题,但不确定在Swing JFrame中使用JFx的影响。

如果有人在JFx中发现新窗口的非焦点窃取方式,请告诉我。
谢谢

 类似资料:
  • 有什么方法可以防止新舞台抢走主舞台的焦点? 我指的是每个新的<代码>阶段。show() 从我的主舞台上偷走了焦点。 我不想把我的JavaFX和Swing混在一起,所以没有将内容嵌入JFrame的选项。此外,这将是伟大的不使用任何弹出,只是纯粹的阶段。 有什么外部库允许我这么做吗?

  • 当我将RecycerView放入嵌套的scrollview中时,屏幕总是跳到RecycerView的顶部,而不是页面的顶部。这里有一个简单的例子。 在这个示例中,我在Recyview上有一个350dp高的空视图,因为您需要在Recyview上有一些内容才能明显显示出来。Recyview iteself包含100个虚拟文本视图。 启动活动后,滚动位于Recyview的顶部,而不是页面的顶部。这一定是

  • 查看这段代码,它们展示了一种在登录后显示新窗口的方法。当用户名和密码是正确的,它打开新的对话框。我想要一个按钮点击打开新的对话框,而不检查用户名和密码。

  • 本文向大家介绍JS打开新窗口防止被浏览器阻止的方法,包括了JS打开新窗口防止被浏览器阻止的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS打开新窗口防止被浏览器阻止的方法。分享给大家供大家参考。具体分析如下: 用传统的window.open()方式打开新窗口,会被浏览器阻止,那么,我们如何才能让JS打开新窗口不被浏览器阻止呢?其实办法还是有的,这里我们就来分析一下如何解决这个问题

  • 当我试图单击位于弹出菜单后面的按钮时,我收到以下错误消息。 此错误消息能够识别阻止我单击的内容的名称 我如何获得这个名称(作为一个元素),以便进行修改, 等待功能不适用,因为此弹出窗口不会消失。我试过网络驱动程序。ActionChains,但它不能解决这个问题

  • 我有A. fxml和B. fxml。运行Java应用程序覆盖启动方法。我想每40分钟循环(5次){打开新阶段B. fxml并等待stage.close,如果阶段关闭继续循环打开新阶段B fxml。循环五次。我尝试定时器timerment我不能。我尝试JavaFX服务我不能。我创建My线程扩展线程对象。这一次,我无法控制下一阶段的循环。当用于声明开始打开5阶段。但是我想循环等待当前阶段关闭,然后进入