ILikeProgramming
ILikeProgramming

Reputation: 293

How to close and iconify a JavaFx stage

In my Java Fx application I create a two stages. The first stage is the default in the main controller class, HomeController. The second, AddNewEmailController, is created by calling a method, showNewComposeNewEmail(), in the AddNewEmailController class.

The new stage gets created fine, but none of the methods I try to call, like closing the AddNewEmailController stage, will work on the AddNewEmailController stage.

How can I get the methods to work?

I'd also like to have the HomeController stage inaccessible once the AddNewEmailController stage gets open, like how pop-up windows do.

I can't even get the AddNewEmailController stage to iconify?

Thank you all in advance.

The HomeController class:

public class HomeController implements Initializable {

// Initializes the controller class.
@Override
public void initialize(URL url, ResourceBundle rb) {
    // TODO
}
@FXML
public void windowClose() {
    Platform.exit();
}

@FXML
public void showNewComposeNewEmail() throws Exception {
    new AddNewEmailController().newnewcomposeNewEmailStage();
}
}

The AddNewEmailController class:

public class AddNewEmailController implements Initializable {

public void setScreenParent(ScreensController screenParent) {
    myController = screenParent;
}

// Initializes the controller class.
@Override
public void initialize(URL url, ResourceBundle rb) {
    // TODO
}

public Stage newComposeNewEmail;

public void newnewcomposeNewEmailStage() throws IOException {
    newComposeNewEmail = new Stage();
    newComposeNewEmail.initStyle(StageStyle.UNDECORATED);
    newComposeNewEmail.initStyle(StageStyle.TRANSPARENT);

    Parent newComposeNewEmailRoot = FXMLLoader.load(getClass().getResource("/wakiliproject/Forms/AddNew/NewEmail/NewEmail.fxml"));

    StageDraggable.stageDraggable(newComposeNewEmailRoot, newComposeNewEmail);

    Scene newComposeNewEmailScene = new Scene(newComposeNewEmailRoot, 590, 670);

    newComposeNewEmail.setScene(newComposeNewEmailScene);
    newComposeNewEmail.show();
}

@FXML
private void newComposeNewEmailClose() {
    newComposeNewEmail.close();
}

@FXML
private void newComposeNewEmailIconify() {
    newComposeNewEmail.setIconified(true);
}
}

UPDATE:

The NewEmail FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="wakiliproject.Forms.AddNew.NewEmail.TryEMailController">
  <children>
    <Label layoutX="190.0" layoutY="61.0" onMouseClicked="#newComposeNewEmailStageIconify" text="Minimise Window" />
    <Label layoutX="300.0" layoutY="61.0" onMouseClicked="#newComposeNewEmailStageClose" text="Close Window" />
  </children>
</AnchorPane>

Upvotes: 0

Views: 1514

Answers (1)

ItachiUchiha
ItachiUchiha

Reputation: 36722

In your fxml, your controller is

fx:controller="wakiliproject.Forms.AddNew.NewEmail.TryEMailController"

while in your code, the class name is

AddNewEmailController

Please make them same and recheck, your method will be called.

For making the new Stage as child of the Parent, please use

newStage.initModality(Modality.WINDOW_MODAL);
newStage.initOwner(PrimaryStage);

Upvotes: 1

Related Questions