Возникли проблемы при переключении сцен в javaFX и Scene Builder - PullRequest
1 голос
/ 02 марта 2020

У меня есть 2 вида:
один с кнопкой, которая говорит «перейти ко второму виду», а другой с меткой.
Я пытаюсь переключаться между двумя сценами, нажимая кнопку.

Для этого я написал следующий код: (класс Controller является контроллером первой сцены)

public class Controller {
    public void switchToSecondScene(ActionEvent event) throws IOException {
        Parent root = FXMLLoader.load(getClass().getResource("sample2.fxml"));
        Scene scene = new Scene(root);
        Stage window = (Stage)((Node)event.getScene().getWindow());

        window.setScene(scene);
        window.show();
    }
}

Проблема в том, что редактор говорит мне, что он не может разрешить метод getScene().

Как я могу это исправить?

1 Ответ

1 голос
/ 02 марта 2020

Как работает приведение к классу, вы добавляете то, к чему хотите привести его, в скобках перед ним.
Возвращаемый результат приводится к тому, что заключено в скобки

// Simple casting, otherThing gets cast to Foo
var something = (Foo)otherThing;

// Whatever is returned by getThing() gets cast to Foo
var something = (Foo)otherThing.getThing();

// Whatever is returned by makeThing() gets cast to Foo
var something = (Foo)otherThing.getThing().makeThing();

Короче говоря, все, что вы захотите присвоить переменной в этом примере, будет приведено к тому, к чему вы хотите привести.

Итак, если мы разберем ваш код с помощью этой логики c:

(Stage)((Node)event.getScene().getWindow());

// assigning to individual variables.
Node window = (Node)event.getScene().getWindow();
Stage stage = (Stage)window;

То, что получает getWindow(), возвращается на сцену. Это не логика c, которую вы хотите. Кроме того, вы упускаете важный шаг в вашем коде. Сначала вам нужно вызвать getSource() для вашего объекта события.

event.getSource() возвращает объект Node (надеемся, что для пуленепробиваемости выполните проверку экземпляра перед приведением).
Объект Node предоставляет вам доступ к необходимым методам.

final Node source = (Node)event.getSource();
final Stage stage = (Stage)source.getScene().getWindow();

Старайтесь назначать переменные своим типам при наведении на слои, чтобы помочь вам определить лог c и найти ошибки. Когда вы вкладываете в гнездо, это может стать беспорядком. Взгляните на работающую одну строку вашего кода при правильной реализации по сравнению с двумя выше. Какой из них яснее?:

(Stage)(((Node)event.getSource()).getScene().getWindow());
...