在JavaFX中,如何打开另一个阶段而不会失去第一个阶段的焦点?

时间:2015-09-18 11:54:22

标签: java javafx

我有一个主舞台必须打开另一个舞台而不会失去第一个舞台的焦点。我知道我可以在致电mainWindow.requestFocus()后致电secondWindow.show(),但我想让它在没有第一个窗口的情况下工作,甚至失去焦点。

我想要这样做,因为第二阶段是一个带有StageStyle.TRANSPARENT的通知窗口,它始终位于顶部并在几秒钟后自行关闭。 有没有办法让第二个窗口“不可聚焦”?

3 个答案:

答案 0 :(得分:4)

您真的需要创建一个新的Stage来显示您的通知窗口吗?您也可以使用javafx.stage.Popup默认创建透明窗口(因此您不需要设置StageStyle.TRANSPARENT)。使用Popup代替Stage的另一个好处是,它不会从主舞台“窃取”焦点,这应该是您所需要的。

以下是有关弹出类的更多信息:https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Popup.html

以下是如何在应用程序中使用弹出窗口的简单示例:https://gist.github.com/jewelsea/1926196

答案 1 :(得分:1)

好吧,我设法将这个java fx阶段嵌入到swing JFrame中。在JFrame上我可以做我想要的。这是如何:

if

如果有人知道不那么脏的方式,我会很感激。

答案 2 :(得分:0)

你需要一些参数。有一种名为stage.setOnShown()的方法,在打开新阶段后立即被调用。

但请注意下面的代码,它将打开第二阶段,没有任何关闭它的可能性,所以你需要杀死应用程序。使用可自动关闭窗口的计时器可以做得更好。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class TwoStage extends Application {

    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Open second stage");
        btn.setOnAction((e) -> {
            Label l = new Label("I'm a second window");
            Scene s = new Scene(l, 100, 100);
            Stage s1 = new Stage(StageStyle.TRANSPARENT);
            s1.centerOnScreen();
            s1.setScene(s);
            s1.initModality(Modality.NONE);
            s1.setAlwaysOnTop(true);
            s1.setOnShown((e1) -> {
                primaryStage.requestFocus();
            });
            s1.show();
        });

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

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

        primaryStage.setTitle("Two Windows");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}