Не перерисовывается экран приложения - Java

Формулировка задачи:

Доброго времени суток! проблема такая, что при старте игры не хочет перерисовывается экран Вот класс JPannal'a Если активный игровой процесс, то рисуем его, иначе рисуем активное меню.
public class GamePanel extends JPanel {
 
    private Game game;
    private AbstractMenu[] menus;
 
    public GamePanel(Game game, AbstractMenu... menus) {
        this.game = game;
        this.menus = menus;
    }
 
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (game.isActive()) {
            System.out.println("Painting game...");  // не выводится в консоль(
            game.paint(g);
            ScoreManager.drawScore(g);
            //repaint();   //перерисовываем пока игра активна(не окончена)
        } else {
            for (AbstractMenu menu : menus) {
                if (menu.isActive()) {
                    menu.paint(g);
                }
            }
        }
    }
}
вот метод старта игры, он запускается если была нажата кнопка старт
public void start() {
 
        while (!isGameOver()) {
 
            canvas.repaint();  //по идее тут не должно быть, но даже вызывая тут перерисовку, экран не перерисовывается
            System.out.println("repaint");
 
            try {
                Thread.sleep(delay);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
 
            if (figure.isFrozen()) {
                figure.leaveOnTheField();
 
                fieldManager.moveDownSpritesInAir(GAME_FIELD_MATRIX);
                fieldManager.clearSpriteFromField(GAME_FIELD_MATRIX);
 
                while (fieldManager.isSpritesInAir(GAME_FIELD_MATRIX)) {
                    fieldManager.moveDownSpritesInAir(GAME_FIELD_MATRIX);
                    fieldManager.clearSpriteFromField(GAME_FIELD_MATRIX);
                }
 
                if (ScoreManager.isCanResetFactor()) {
                    ScoreManager.resetFactor();
                }
 
                strategySpeedGame.upSpeedGame();
 
                figure = figureManager.createFigure();
                spritesInFigure = figure.getSpritesInFigure();
            } else {
                figure.moveDown();
            }
        }
    }
Кнопка старт делает класс игры активным и запускает метод старт
public class ButtonListenerImpl implements ButtonListener { //это иннер класс
        @Override
        public void onEvent() {
            for (DeactivateListener listener : listeners) {
                listener.deactivate(); //даем понять другим, что бы они перестали быть активны, ибо активны мы)
            }
 
            active = true;
            System.out.println(Game.this.toString());
            if (!gameOver) {
                start();
            } else {
                restart();
            }
        }
    }
Прикол в том, что метод старт отрабатывает, но не хочет перерисовываться(остается главное меню) и по окончанию игры(заполнилось игровое пространство) экран перерисовывается на меню "игра окончена" (так и должно быть)) Если запускать метод страт через мейн вручную, то все норм. Вдруг кому понадобиться исходники - вот: http://github.com/JavaBoy3578/The-Balls-Game.git


textual

Код к задаче: «Не перерисовывается экран приложения - Java»

import com.leus.model.factories.figureFactories.FigureFactory;
import com.leus.model.graphics.figures.AbstractFigure;
import com.leus.model.graphics.sprites.AbstractSprite;
import com.leus.model.listeners.ButtonListener;
import com.leus.model.listeners.DeactivateListener;
import com.leus.model.listeners.GameOverListener;
import com.leus.model.listeners.KeyControllerListener;
import com.leus.model.service.FieldManager;
import com.leus.model.service.FigureManager;
import com.leus.model.service.scores.ScoreManager;
import com.leus.view.displays.Display;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class Game extends JPanel {
 
    public static final int TILE_WIDTH = 32;
    public static final int TILE_HEIGHT = 32;
 
    private static long delay = 50;
 
    private static final AbstractSprite[][] GAME_FIELD_MATRIX = new AbstractSprite[Display.getHeightWindowInTile() + 1][Display.getWidthWindowInTile()];
    private static final UpSpeedGameStrategy DEFAULT_UP_SPEED_GAME = () -> {
        long currentScore = ScoreManager.getScore();
        boolean lowScore = currentScore > 1000 && currentScore < 2000;
        boolean midScore = currentScore > 2000 && currentScore < 3000;
        boolean highScore = currentScore > 3000 && currentScore < 6000;
        boolean veryHighScore = currentScore > 6000 && currentScore < 9000;
        boolean superScore = currentScore > 9000;
        if (lowScore) {
            delay = 450;
        } else if (midScore) {
            delay = 375;
        } else if (highScore) {
            delay = 300;
        } else if (veryHighScore) {
            delay = 200;
        } else if (superScore) {
            delay = 125;
        }
    };
 
    private List<DeactivateListener> listeners = new ArrayList<>();
    private List<GameOverListener> gameOverListeners = new ArrayList<>();
    private FigureManager figureManager = new FigureManager();
    private UpSpeedGameStrategy strategySpeedGame = DEFAULT_UP_SPEED_GAME;
    private AbstractFigure figure;
    private FieldManager fieldManager;
    private AbstractSprite[] spritesInFigure;
    private JPanel canvas;
 
    private Display display;
 
    Timer timer = new Timer(50, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            start();
        }
    });
 
    public void setCanvas(JPanel canvas) {
        this.canvas = canvas;
    }
 
    private boolean active;
    private boolean gameOver;
 
    public Game(FieldManager fieldManager, FigureFactory... figureFactories) {
        if (fieldManager == null || figureFactories == null) {
            throw new NullPointerException("Field Manager or Figure Factories is null: " + fieldManager + ", " + Arrays.toString(figureFactories));
        }
 
        if (figureFactories.length == 0) {
            throw new IllegalArgumentException("No FigureFactories");
        }
 
        figureManager.registrationFigureFactories(figureFactories);
        figure = figureManager.createFigure();
        this.fieldManager = fieldManager;
        this.spritesInFigure = figure.getSpritesInFigure();
    }
 
    public static AbstractSprite[][] getGameFieldMatrix() {
        return Arrays.copyOf(GAME_FIELD_MATRIX, GAME_FIELD_MATRIX.length);
    }
 
    public boolean isActive() {
        return active;
    }
 
    public AbstractFigure getFigure() {
        return figure;
    }
 
    public void setStrategySpeedGame(UpSpeedGameStrategy speedGameStrategy) {
        this.strategySpeedGame = speedGameStrategy;
    }
 
    public void start() {
 
        if (!isGameOver()) {
            canvas.repaint();
//            System.out.println("repaint");
 
            try {
                Thread.sleep(delay);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
 
            if (figure.isFrozen()) {
                figure.leaveOnTheField();
 
                fieldManager.moveDownSpritesInAir(GAME_FIELD_MATRIX);
                fieldManager.clearSpriteFromField(GAME_FIELD_MATRIX);
 
                while (fieldManager.isSpritesInAir(GAME_FIELD_MATRIX)) {
                    fieldManager.moveDownSpritesInAir(GAME_FIELD_MATRIX);
                    fieldManager.clearSpriteFromField(GAME_FIELD_MATRIX);
                }
 
                if (ScoreManager.isCanResetFactor()) {
                    ScoreManager.resetFactor();
                }
 
                strategySpeedGame.upSpeedGame();
 
                figure = figureManager.createFigure();
                spritesInFigure = figure.getSpritesInFigure();
            } else {
                figure.moveDown();
            }
        } else {
            timer.stop();
        }
    }
 
    @Override
    public String toString() {
        return "Game{" + "figure=" + figure +
                ", deactivate=" + active + '}';
    }
 
    public void paint(Graphics g) {
        figure.paint(g);
        for (AbstractSprite[] line : GAME_FIELD_MATRIX) {
            for (AbstractSprite elem : line) {
                if (elem != null) {
                    elem.paint(g);
                }
            }
        }
    }
 
    public void addListener(DeactivateListener listener) {
        listeners.add(listener);
    }
 
    public void removeListener(DeactivateListener listener) {
        listeners.remove(listener);
    }
 
    public void addListener(GameOverListener listener) {
        gameOverListeners.add(listener);
    }
 
    public void removeListener(GameOverListener listener) {
        gameOverListeners.remove(listener);
    }
 
    private boolean isGameOver() {
        for (AbstractSprite elem : spritesInFigure) {
            if (elem.isOutField()) {
                active = false;
                timer.stop();
                gameOver = true;
                for (GameOverListener listener : gameOverListeners) {
                    listener.onEvent();
                }
                return true;
            }
        }
 
        return false;
    }
 
    private void clearField() {
        for (AbstractSprite[] line : GAME_FIELD_MATRIX) {
            for (AbstractSprite elem : line) {
                if (elem != null) {
                    elem.clear();
                }
            }
        }
    }
    public void restart() {
        clearField();
        ScoreManager.resetScore();
        start();
    }
 
    public class GameKeyListener implements KeyControllerListener {
        @Override
        public boolean isActive() {
            return active;
        }
 
        @Override
        public void onEvent(KeyEvent e) {
            if (active) {
                if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                    keyDown();
                }
 
                if (e.getKeyCode() == KeyEvent.VK_UP) {
                    keyUp();
                }
 
                if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                    keyLeft();
                }
 
                if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                    keyRight();
                }
            }
        }
 
        private void keyUp() {
            if (!figure.isFrozen()) {
                figure.rotate();
            }
        }
 
        private void keyLeft() {
            if (!figure.isFrozen()) {
                figure.moveLeft();
            }
        }
 
        private void keyRight() {
            if (!figure.isFrozen()) {
                figure.moveRight();
            }
        }
 
        private void keyDown() {
            if (!figure.isFrozen()) {
                figure.fastMoveDown();
            }
        }
    }
 
    public class ButtonListenerImpl implements ButtonListener {
        @Override
        public void onEvent() {
            for (DeactivateListener listener : listeners) {
                listener.deactivate();
            }
 
            active = true;
            timer.start();
            System.out.println(Game.this.toString());
 
 
            if (!gameOver) {
                start();
            } else {
                restart();
            }
        }
    }
 
    public class DeactivateListenerImpl implements DeactivateListener {
        @Override
        public void deactivate() {
            active = false;
        }
    }
 
}
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.


СДЕЛАЙТЕ РЕПОСТ

12   голосов, оценка 3.667 из 5

Источник