Почему обновление, повторная проверка и перерисовка JFrame не обновляют окно? - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь создать оконную раму для отображения окна игры. Я расширил JFrame в своем классе GameWindow и создал два метода: drawBackground, который заполняет экран сплошным прямоугольником, и drawGrid, который рисует последовательные линии, используя цикл for для создания сетки. Вот мой код.

public class GameWindow extends JFrame {

    // instance variables, etc.

    public GameWindow(int width, Color bgColor) {
        super();

        // ...

        this.setVisible(true);
    }

    public void drawBackground() {
        Graphics g = this.getGraphics();

        g.setColor(bgColor);
        g.fillRect(0, 0, this.getWidth(), this.getWidth());

        // I suspect that the problem is here...
        this.update(g);
        this.revalidate();
        this.repaint();
        g.dispose();
    }

    public void drawGrid() {
        Graphics g = this.getGraphics();

        g.setColor(Color.BLACK);

        for (int i = tileWidth; i < TILE_COUNT * tileWidth; i += tileWidth) {

            g.drawLine(0, i * tileWidth, this.getWidth(), i * tileWidth);
            g.drawLine(i * tileWidth, 0, i * tileWidth, this.getHeight());

        }

        // ... and here.
        this.update(g);
        this.revalidate();
        this.repaint();
        g.dispose();
    }

}

Однако, когда я пытаюсь протестировать этот класс в такой программе:

public class Main {
    public static void main(String[] args) {
        GameWindow game = new GameWindow(700);

        game.drawBackground();
        game.drawGrid();
    }
}

рамка появляется на экране, но остается пустой; ни фон, ни сетка не прорисовываются. Я пытался Graphics g = this.getGraphics() до this.getContentPane().getGraphics(). Я также пытался использовать много разных комбинаций и порядков в drawBackground и drawGrid из revalidate, update и т. Д. Ни одна из этих попыток не сработала. Как я могу исправить эту проблему?

1 Ответ

0 голосов
/ 24 января 2019

Ну, Graphics g = this.getGraphics(); было бы хорошим началом. Так как repaint просто планирует прохождение рисования с RepaintManager, весь код, использующий getGraphics, будет просто игнорироваться.

Это не так, как обычай рисовать. getGraphics может возвращать null и, в лучшем случае, является снимком последнего цикла рисования, все, что вы рисуете, будет стерто в следующем цикле рисования.

Кроме того, не dispose контекста Graphics, который вы не создали, в некоторых системах это не позволит другим компонентам использовать его

Начните с рассмотрения Выполнение пользовательской живописи и Рисование в AWT и Swing , чтобы лучше понять, как работает живопись и как с ней работать.

Вы также, вероятно, захотите прочитать Параллельность в Swing и Как использовать Swing Timers для идей по созданию "основного цикла" для обновления пользовательский интерфейс с постоянной скоростью, так как Swing является однопоточным И не безопасным для потоков

...