JavaFx停止新窗口窃取焦点

时间:2015-10-15 14:39:21

标签: java javafx focus

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

通过假设是您问题的原因来防止您所描述的内容,那么您需要添加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