【问题标题】:JavaFx stop new window stealing focusJavaFx 停止新窗口窃取焦点
【发布时间】:2016-01-14 02:00:54
【问题描述】:

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.show() 的任何想法?谢谢

【问题讨论】:

    标签: java javafx focus


    【解决方案1】:

    为了防止你所描述的假设是你的问题的原因,那么你需要添加 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. 
    

    你看到问题了吗?您的按钮将始终响应点击事件,该事件将创建一个新的Stage,因此关注该Stage

    【讨论】:

    • 您好,感谢您的回复。默认的 Modality 是 NONE,所以我没有设置,设置没有区别。我不确定我是否把问题说清楚了。我想要一个新的舞台突然出现,但我不想把注意力集中在它上面,我想把注意力留在原来的地方。我没有在按钮上设置大小,因为它只是为了快速演示,以便根据命令制作另一个舞台弹出窗口。
    【解决方案2】:

    万一有人在搜索,我找不到解决方案,但我找到了一个有同样问题的人,他为 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 中发现新窗口的非焦点窃取方式,请告诉我。
    谢谢

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      相关资源
      最近更新 更多