Вы можете получить ссылку на Scene
и Window
из ссылки на вашу кнопку. Оттуда вам решать, как вы хотите показать новое представление.
Вот как вы получаете эти ссылки:
Scene scene = btnSignIn.getScene();
Window window = scene.getWindow();
Stage stage = (Stage) window;
Вы можете изменить представление, изменив корень вашей сцены:
FXMLLoader loader = ... // create and load() view
btnSignIn.getScene().setRoot(loader.getRoot());
Или вы можете изменить всю сцену:
FXMLLoader loader = ... // create and load() view
Stage stage = (Stage) btnSignIn.getScene().getWindow();
Scene scene = new Scene(loader.getRoot());
stage.setScene(scene);
Попробуйте использовать valgrind для отладки вашей проблемы.
Если ваша ошибка сохраняется даже при удалении всех free
, это может быть связано с тем, что какой-то код переполняет свою зону памяти ( например переполнение буфера).
Если ваш код уничтожает указатель, используемый другим кодом, другой код может вызвать вызов free
с недопустимым указателем. Вероятно, вы получаете доступ к некоторой памяти, которой вы не владеете.
Это может произойти много, вот два общих:
1) Если вы объявите массив, подобный int f[7];
, последний элемент массива - f[6]
. Изменение f[7]
может испортить чью-либо память.
2) Если вы сохраняете указатель на объект, выделенный в стеке, этот объект выходит из области видимости, а затем вы что-то изменяете с помощью этого указателя, вы можете поврежденная чужая память.