如何从JavaFX中的另一个类关闭窗口?

时间:2016-02-21 02:43:33

标签: javafx

我在尝试从另一个Controller类关闭“登录”窗口时遇到问题。 Login窗口在Main.java中打开,但fxml文件由LoginController.java控制。我试图扩展Main.java类以关闭舞台,但这不起作用。我也试图通过方法,但没有太多运气。这是我的代码:

主:

public class Main extends Application {
    Stage window;
    Parent root;

    @Override
    public void start(Stage primaryStage) {
        window = primaryStage;
        try {
            root = FXMLLoader.load(getClass().getResource("/application/Login.fxml"));
            Scene scene = new Scene(root);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            window.setScene(scene);
            window.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);

    }
}

的LoginController:

public class LoginController extends Main implements Initializable{
    public LoginModel loginModel = new LoginModel();


    @FXML
    private Label isConnected;

    @FXML
    private TextField txtUsername;

    @FXML
    private TextField txtPassword;

    @FXML
    private Button loginButton;

    @FXML
    private Button cancelButton;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // TODO Auto-generated method stub
        if (loginModel.isDbConnected()) {
            isConnected.setText("Connected");
        } else {
            isConnected.setText("Not Connected");
        }
    }

    public void Login (ActionEvent event) {
        try {
            if (loginModel.isLogin(txtUsername.getText(), txtPassword.getText())) {
                isConnected.setText("Username and password are correct");
                ((Node)event.getSource()).getScene().getWindow().hide();
                Stage primaryStage = new Stage();
                FXMLLoader loader = new FXMLLoader();
                Pane root = loader.load(getClass().getResource("/application/Main.fxml").openStream());
                //UserController userController = (UserController)loader.getController();
                //userController.GetUser(txtUsername.getText());
                Scene scene = new Scene(root);
                scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
                primaryStage.setScene(scene);
                primaryStage.show();


            } else {
                isConnected.setText("Username and password are not correct");
            }
        } catch (SQLException e) {
            isConnected.setText("Username and password are not correct");
            // TODO Auto-generated catch block
            System.out.println(e);
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println(e);
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void cancelLogin() {
        window.close();
    }
}

FXML代码行:

<Button layoutX="110.0" layoutY="125.0" minWidth="70.0" mnemonicParsing="false" onAction="#cancelLogin" text="Cancel" />

我还尝试在LoginController中创建一个Main对象并使用main.window.close();但这似乎也没有用(这是在扩展Main之前)。任何帮助都会有很大的帮助,我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

子类化Main不会产生任何影响,也不会在对象中创建window字段,而该对象不是调用方法的控制器对象。你只需要获得对窗口的引用。

你可以做,例如,

public void cancelLogin() {
    cancelButton.getScene().getWindow().hide();
}

只要您正确映射了按钮(看起来你已经省略了FXML中的fx:id):

<Button fx:id="cancelButton" layoutX="110.0" layoutY="125.0" minWidth="70.0" mnemonicParsing="false" onAction="#cancelLogin" text="Cancel" />

当然,如果您的实际目标是完全退出应用程序,则可以使用

执行此操作
public void cancelLogin() {
    Platform.exit();
}