Java. Получение родительского элемента

297
13 ноября 2017, 19:09

Доброго времени суток! Столкнулся с проблемой в реализации определенной механики в игре. Итак, у меня имеется класс,в котором я создаю поле для игры. В этом классе у нас есть двумерный массив Pane[5][18],который представляет из себя поле 5 на 18. Предположим,в Pane[2][2] я заношу определенный элемент. Для этого элемента у меня есть другой класс, (наследующийся от класса Pane) в котором я хочу реализовать механику движения на клетку вперед по таймеру. Собственно,вот функция:

public void startMove() {
    timeline = new Timeline(new KeyFrame(Duration.seconds(moveSpeed), ev -> {
        if(this.getParent()!=null) {
            Pane parent = (Pane) this.getParent();
            parent.getChildren().remove(this); 
        }
    }));
    timeline.setCycleCount(Animation.INDEFINITE);
    timeline.play();
}

Собственно,проблема в том,я получил родительский Pane[2][2],и из него я удалить элемент могу. Но теперь мне нужно получить Pane[2][3],и занести в него мой элемент. Как это можно реализовать не передавая в функцию сам массив?

Answer 1

Вообще, тут в логике проблема. Элемент не должен сам себя удалять. Это должен делать контроллер, как по мне.

То есть, создайте интерфейс типо:

public interface LocationChanged {
     void onLocationChanged(Pane pane);
}

Реализуйте его в вашем классе, который поле создаёт:

public MyController implements LocationChanged  {
    public void onLocationChanged(Pane pane) {
        // этот ваш класс имеет доступ ко всему полю
        // удаляйте из старой ячейки
        // добавляйте в новую
    }
}

При создании экземпляра вашей ячейки прокидывайте туда ссылку на ваш контроллер, а в методе startMove вызывайте этот колбек.

public class MyPane extends Pane {
     private LocationChanged  mListener;
     public MyPane (LocationChanged  listener) {
          mListener = listener;
     }
    public void startMove() {
         timeline = new Timeline(new KeyFrame(Duration.seconds(moveSpeed), ev -> {
             mListener.onLocationChanged(this);
         }));
         timeline.setCycleCount(Animation.INDEFINITE);
         timeline.play();
    }

}
READ ALSO
Перенос значений из списка в другой класс

Перенос значений из списка в другой класс

Собственно сабжВ отдельном классе парсю страницу,в другом создаю GUI

271
Android Studio - как выявить утечку памяти с помощью Android Profiler

Android Studio - как выявить утечку памяти с помощью Android Profiler

Пишу игру с помощью LibgdxЗапустив Android profiler, заметил что игра жрет приличное количество памяти

234
Как передать в cURL дату в формате Java Date?

Как передать в cURL дату в формате Java Date?

Есть Android-приложение, оно отправляет на сервер через Parsecom один из параметров в формате Date:

189
switch не считывает строки

switch не считывает строки

Добрый день, у меня возникла проблема с incompatible types error, проблема заключается в том что switch не считывает строки, хотя версия jdk 9

272