我在尝试从另一个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之前)。任何帮助都会有很大的帮助,我不知道该怎么做。
答案 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();
}