单击按钮显示新阶段时如何关闭当前阶段

时间:2014-11-12 00:37:53

标签: javafx stage scene

所以我正在开发一个密码管理应用程序,这是我第一次尝试使用Java进行GUI。我在应用程序关闭登录窗口后,一旦用户单击“登录”按钮并只显示主应用程序窗口。每当我尝试这样做时,我的setPrevStage方法存储NULL值,prevStage.close()方法导致程序崩溃并出现NullPointerException。不知道我做错了什么,所以任何建议都非常感谢。这是我的.java文件,用于此操作。

    package pwmanager;

    import java.io.IOException;
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.event.ActionEvent;
    import javafx.event.EventType;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.GridPane;
    import javafx.stage.Stage;


    /**
     *
     * @author 176878
     */
    public class FXMLDocumentController implements Initializable {

    @FXML
    private Button loginButton;


    @FXML
    Stage prevStage;
    Stage currentStage;
    public void setPrevStage(Stage stage){
        prevStage = stage;
        if (stage == null){
            System.out.println("Stage NULL");
        }

       }

    @FXML
    public void getPrevStage(Stage stage){
        currentStage = prevStage;

    }

    @FXML
    public void loginButtonAction(ActionEvent event) throws IOException {
       System.out.println("You clicked me, logging in!");
        setPrevStage(prevStage);

        Stage stage = new Stage();


        FXMLLoader loader = new FXMLLoader(getClass().getResource("MainScreen.fxml"));

        Parent mainScreen = (Parent)loader.load();
        Scene scene = new Scene(mainScreen);

        stage.setScene(scene);
        stage.setTitle("Password Manager");
        prevStage.close();
        stage.show();
    }    

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    

}

2 个答案:

答案 0 :(得分:0)

我没有得到你的问题。但我正在给出我的解决方案,这里的代码可能会对你有所帮助

Stage st = (Stage) loginbutton.getScene().getWindow();
            st.hide();
            try 
                {
                  showFxml(filex);
                } 
            catch (Exception exp)
                {
                  System.out.println("file loading problem "+exp);
                }

这是showFxml()

public void showFxml(String filen)throws Exception
 {
   FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(""+filen+""));
   Parent root1 = (Parent) fxmlLoader.load();
   Stage stage = new Stage();
   stage.initModality(Modality.APPLICATION_MODAL);
   stage.setTitle("Password Manager");
   stage.setScene(new Scene(root1)); 
   stage.show();
 }

通过使用此功能,您可以隐藏前一阶段并将其带到当前阶段。

答案 1 :(得分:0)

如果在prevStage中存在“旧”阶段,那么您可以尝试:

@FXML
public void loginButtonAction(ActionEvent event) throws IOException {
   System.out.println("You clicked me, logging in!");

    FXMLLoader loader = new FXMLLoader(getClass().getResource("MainScreen.fxml"));

    Parent mainScreen = (Parent)loader.load();
    Scene scene = new Scene(mainScreen);

    prevStage.setScene(scene);
    prevStage.setTitle("Password Manager");
    prevStage.show();
}  

如果不是......在你的Start.class中你定义了静态舞台舞台并在此设置你的主要内容阅读这个例子:

public class Start extends Application {

    static Stage stage;

    @Override
    public void start(Stage primarystage) {
        stage=primarystage;

        ...

         stage.show();
    }

}

现在代码是这样的:

@FXML
public void loginButtonAction(ActionEvent event) throws IOException {
   System.out.println("You clicked me, logging in!");

    prevStage=Start.stage;   // Start.class

    FXMLLoader loader = new FXMLLoader(getClass().getResource("MainScreen.fxml"));

    Parent mainScreen = (Parent)loader.load();
    Scene scene = new Scene(mainScreen);

    prevStage.setScene(scene);
    prevStage.setTitle("Password Manager");
    prevStage.show();
}