Coming from How to reference primaryStage I learned that I can get the Stage
of a particular control by using control.getScene.getWindow()
, but this returns a Window
instead of a Stage
. I know that Stage
is a type of Window
, but my question is will the returned object always be a Stage
, or will it be something else in some cases? Also, will I know that it will be something else?
Asked
Active
Viewed 2,890 times
0

Community
- 1
- 1

Sarah Szabo
- 10,345
- 9
- 37
- 60
1 Answers
2
The subclasses of Window
in the JavaFX API are Stage
and PopupWindow
. PopupWindow
in turn is a superclass of Popup
, ContextMenu
, and Tooltip
, and of course it's possible to define your own subclasses. So it's reasonably easy to design a case where control.getScene().getWindow()
returns something that is not a Stage
:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.stage.Window;
public class ContextMenuExample extends Application {
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
Label label = new Label("Right click here");
root.getChildren().add(label);
ContextMenu contextMenu = new ContextMenu();
MenuItem menuItem = new MenuItem();
contextMenu.getItems().add(menuItem);
final Button button = new Button("Click Me");
menuItem.setGraphic(button);
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Window window = button.getScene().getWindow();
System.out.println("window is a stage: "+(window instanceof Stage));
}
});
label.setContextMenu(contextMenu);
Scene scene = new Scene(root, 250, 100);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
If you use FXML, you probably shouldn't assume that your enclosing Window
is a Stage
as you might conceivably re-use the FXML as the content of a Popup
, or other non-Stage
Window
, in the future.

James_D
- 201,275
- 16
- 291
- 322