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

  1. Доброго времени суток! проблема такая, что при старте игры не хочет перерисовывается экран Вот класс JPannal'a Если активный игровой процесс, то рисуем его, иначе рисуем активное меню. Кликните здесь для просмотра всего текста


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;
        }
    }
 
}

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

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



Похожие ответы
  1. Здравствуйте. Мне была дана задача - сделать кнопку, которая будет перемещаться в случайную точку экрана, при наведении на нее курсора, так, чтобы ее невозможно было поймать... Я знаю, скорей всего это очень простая задача, но моей головы совершенно не хватет додумать, либо это незнание методов, либо просто пустота в голове)) Помогите пожалуйста. (Стаж = 1 мес (почти))

  1. Всем доброго дня, я хочу сделать так, чтобы мой JFrame нельзя было вернуть в нормальное состояние. Т.е. у меня оно у меня сразу вводится в полноэкранный режим и я хочу исключить возможность выхода из него. Попробовал setResizable(false), но тогда окно само автоматически выходит из полноэкранного режима, а это совсем плохо. Так как сделать так, чтобы окно вошло в полноэкранный режим и никогда из него не вышло? Я ещё добавил слушателя к окну, типа когда она разворачивается оно сразу сворачивается, но это бред. Жду ваших предложений.

  1. Создать программу на языке JAVA. На основе класса Thread, окно должно само двигаться по экрану.

  1. Написал листенер для кнопки. Но бывает она пропадает. структура проекта простая relative layout и в нем кнопка

  1. Создать окно и расположить его точно в центр экрана.

  1. Мне нужна команда в слушатель, которая при максимизации фрейма делает его полноэкранным, setUndecorated(true); Однако, мне компилятор дает понить при выполнении этого слушателя, что: Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is displayable. at java.awt.Frame.setUndecorated(Unknown Source) at gfm.GraphicFramesModule$7.windowStateChanged(GraphicFramesModule.java:386) at java.awt.Window.processWindowStateEvent(Unknown Source) at java.awt.Window.processEvent(Unknown Source) .....Добавлено через 52 секунды Где 386 строка - как раз команда MineFrame.this.setUndecorated(true) в слушателе на максимизацию фрейма.Добавлено через 1 минуту Так вот, каким боком мне мешает то, что "фрейм может быть отображен"?! И даже сетВизибл фолс и тру вокруг команды толку не дали.

  1. У меня какая то непонятная вещь получается с текстовым полем, которое больше похоже на текстовую область(хотя активная лиш одна строка), но занята очень большая область. Вот код:

  1. Всем доброго времени суток! Всё, что нужно от программы: двигать квадрат размером 20*20 кв. пикселей клавишами вверх-влево-вниз-вправо, а так же клавишами WASD. И от того, нажата ли Shift одновременно с вышеназванными клавишами, зависит длина шага этого квадрата. Проблема в том, что фигура отрисовывается нормально, и прога никаких ошибок в консоль не выводит, но квадрат не реагирует на клавиши. Вообще. Тупо стоит на месте. Скорее всего (на мой взгляд), проблема связана с фокусом, да вот сам не разбираюсь ещё в таких вещах, поэтому могу ошибиться. Подскажите, что не так? Вот код:

  1. Подскажите пожалуйста только сейчас начинаю работать со swing , как можно таблицу поставить более выше , к краю экрана.