51

Looking at this code they show a way to display a new window after a login. When username and password are correct it opens new dialog. I want a button click to open new dialog, without checking for username and password.

blo0p3r
  • 6,790
  • 8
  • 49
  • 68
MehmanBashirov
  • 641
  • 1
  • 7
  • 15
  • 11
    It's important that you take the time to learn this kind of stuff. I you are looking to use JavaFX in any way, I would suggest going through a few tutorials. I would recommend [this one](http://docs.oracle.com/javafx/2/get_started/jfxpub-get_started.htm) – blo0p3r Feb 23 '13 at 15:07
  • 1
    The link is broken – ds_practicioner Sep 13 '20 at 02:57

3 Answers3

105

If you just want a button to open up a new window, then something like this works:

btnOpenNewWindow.setOnAction(new EventHandler<ActionEvent>() {
    public void handle(ActionEvent event) {
        Parent root;
        try {
            root = FXMLLoader.load(getClass().getClassLoader().getResource("path/to/other/view.fxml"), resources);
            Stage stage = new Stage();
            stage.setTitle("My New Stage Title");
            stage.setScene(new Scene(root, 450, 450));
            stage.show();
            // Hide this current window (if this is what you want)
            ((Node)(event.getSource())).getScene().getWindow().hide();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Timothy Cope
  • 482
  • 2
  • 11
blo0p3r
  • 6,790
  • 8
  • 49
  • 68
  • 3
    Is there a way to 'drop' the existing window instead of hiding it? – will Oct 28 '14 at 11:56
  • 1
    @will `close`ing and `hide`ing a window is the same thing. ­[this answer](http://stackoverflow.com/a/10217157/686036) is good at explaining this concept. – blo0p3r Oct 28 '14 at 12:06
  • I mean drop it as-in delete the instance. I have a long running app (weeks) and I don't need any resources un-garbage collected to gather lint. – will Oct 28 '14 at 12:14
  • 4
    That's exactly it. `hide`ing it or `close`ing it will remove it. Just delete any reference to this window/stage (such you would do with any other java object). – blo0p3r Oct 28 '14 at 12:17
  • I'm trying to hide window from menuitem `ActionEvent` but getting exception "menuitem cannot be casted to Node". `Caused by: java.lang.ClassCastException: javafx.scene.control.MenuItem cannot be cast to javafx.scene.Node` – Inzimam Tariq IT Oct 07 '17 at 21:45
  • Is there any reason for not declaring root just where you initialize it? – Line Jan 24 '18 at 15:33
  • 1
    @Line In this example not really. But assuming you want to do something else with `root` outside of the try block then it would be useful. – blo0p3r Jan 25 '18 at 13:20
21

I use the following method in my JavaFX applications.

newWindowButton.setOnMouseClicked((event) -> {
    try {
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(getClass().getResource("NewWindow.fxml"));
        /* 
         * if "fx:controller" is not set in fxml
         * fxmlLoader.setController(NewWindowController);
         */
        Scene scene = new Scene(fxmlLoader.load(), 600, 400);
        Stage stage = new Stage();
        stage.setTitle("New Window");
        stage.setScene(scene);
        stage.show();
    } catch (IOException e) {
        Logger logger = Logger.getLogger(getClass().getName());
        logger.log(Level.SEVERE, "Failed to create new Window.", e);
    }
});
SkidRunner
  • 813
  • 8
  • 12
4

The code below worked for me I used part of the code above inside the button class.

public Button signupB;

public void handleButtonClick (){

    try {
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(getClass().getResource("sceneNotAvailable.fxml"));
        /*
         * if "fx:controller" is not set in fxml
         * fxmlLoader.setController(NewWindowController);
         */
        Scene scene = new Scene(fxmlLoader.load(), 630, 400);
        Stage stage = new Stage();
        stage.setTitle("New Window");
        stage.setScene(scene);
        stage.show();
    } catch (IOException e) {
        Logger logger = Logger.getLogger(getClass().getName());
        logger.log(Level.SEVERE, "Failed to create new Window.", e);
    }

}

}
Leonardo
  • 49
  • 3