我有一个主舞台必须打开另一个舞台而不会失去第一个舞台的焦点。我知道我可以在致电mainWindow.requestFocus()
后致电secondWindow.show()
,但我想让它在没有第一个窗口的情况下工作,甚至失去焦点。
我想要这样做,因为第二阶段是一个带有StageStyle.TRANSPARENT的通知窗口,它始终位于顶部并在几秒钟后自行关闭。 有没有办法让第二个窗口“不可聚焦”?
答案 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);
}
}