JavaFX, Рисование на Canvas

253
26 декабря 2017, 16:51

Как рисовать на одном Canvas из разных классов? Проблема в том, что при обращении к canvas из разных классов возвращаются разные ссылки.

Главный класс, загружающий приложение:

@FXML
public Canvas game = new Canvas(WIDTH, HEIGHT);
//Объект для взаимодействия с классом.
public static GameController gamecontroller = new GameController();
//Графический контекст, из которого я рисую
public GraphicsContext gc = this.getGraphicsContext();
public void initialize(URL url, ResourceBundle resourceBundle) {
    System.out.println("Game was loaded");
    gc = getGraphicsContext(); //{return draw.getGraphicsContext2D;}
    gc.setFill(Color.BLACK);
    gc.fillRect(0,0,WIDTH,HEIGHT);
    Handler.handler.addGameObject(new Player(30.0, 30.0, Id.player)); //Добавляю объект на сцену
    Handler.handler.render(); //Рисую его
}
public GraphicsContext getGraphicsContext()
{
    return game.getGraphicsContext2D();
}

Также у меня есть класс GameObject, от которого наследуются классы игровых объектов, Player, например. GameObject:

public static GraphicsContext draw
        = GameController.gamecontroller.getGraphicsContext(); 

Player:

public void render() {
    draw.setFill(Color.WHITE);
    draw.fillRect(10,10,16,16);
}

То есть метод render() работает, но на Canvas ничего не отображается, почему-то при обращении к одному объекту (или при обращении к функции, которая возвращает значение), возвращаются разные ссылки на него.

Answer 1

Вероятно, у вас получается несколько экземпляров класса GameController. Вы создаете первый где-то при старте своего приложения, вызываете его метод initialize. Тот, в свою очередь, вызывает render на объекте Player, а render читает статическое поле gamecontroller. А поле gamecontroller инициализировано другим экземпляром GameController. Вот и получается, что вы обращаетесь к совсем другому объекту.

Попробуйте исправить свой код так:

...
public static GameController gamecontroller; // оставьте это поле неинициализированным
...
public void initialize(URL url, ResourceBundle resourceBundle) {
    ....
    gamecontroller = this; // пусть теперь это поле ссылается на созданный вами экземпляр GameController
    ...
}

Если ваш код нигде больше не дергает GameController.gamecontroller до инициализации поля, то NullPointerException не вылетит и все будет замечательно.

READ ALSO
Бот для чат приложения android [требует правки]

Бот для чат приложения android [требует правки]

ЗдравствуйтеНадо нужно написать бота для чат-приложения

188
Работа с HQL HIBERNATE

Работа с HQL HIBERNATE

Не понимаю в чем проблема

222