Как правильно отрисовывать объекты в java swing

298
22 декабря 2017, 01:28

У меня есть много объектов, которые хочу отрисовать на экран. Если дело обстоит в обычной отрисовке, то тут никаких проблем не возникает, все объекты отрисовываются моментально, глаз не успевает даже заметить что произошло, но когда мне требуется часто обновлять view (JPanel), то тут возникает проблема:

некоторые объекты начинают пропадать на долю секунды и снова появляться, при чём неважно, стоит ли объект на месте или двигается.

Для обновления я использовал данную функцию:

public void slowMove(int x, int y) {
    int currentX = this.x;
    int currentY = this.y;
    Thread thread = new Thread(() -> {
        while (this.x != currentX + x) {
            this.x = 4 * x / Model.FIELD_CELL_SIZE + this.x;
            try {
                Thread.sleep(16);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            update();
        }
        while (this.y != currentY + y) {
            this.y = 4 * y / Model.FIELD_CELL_SIZE + this.y;
            try {
                Thread.sleep(16);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            update();
        }
    });
    thread.start();
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

Объекты я получаю из сета объектов и в цикле for отрисовываю их по одному.

public void paintComponent(Graphics g) {
    g.setColor(new Color(0x000000));
    g.fillRect(0, 0, 500, 500);
    GameObjects gameObjects = view.getGameObjects();
    if (gameObjects != null)
        for (GameObject gameObject : gameObjects.getAll()) {
            gameObject.draw(g);
        }
    super.paintComponent(g);
}

Вот пример draw классов:

@Override
public void draw(Graphics graphics) {
    Graphics2D g2 = (Graphics2D) graphics;
    g2.drawImage(image, x, y, width, height, null);
}
Answer 1

Используй двойную буферизацию, сначала нарисуй все объекты на картинке(BufferedImage напр.), а потом уже ее.

READ ALSO
Перечисления(Enum) Java

Перечисления(Enum) Java

Например, у меня есть класс Person, у которого есть конструктор

264
Вопрос? В чём причина?

Вопрос? В чём причина?

/*При вводе n-го количества символов при условии, что первый введённый символ находится в диапазоне от 1 до 5 программа работает не корректно*/

222
ObservableList для чего

ObservableList для чего

Поясните пожалуйста что из себя представляет в JavaFx список ObservableList и для чего он используется? Можно ли вместо обычных ArrayList использовать...

281