Repaint () не вызывается, если я использую ImageIO.read () - PullRequest
0 голосов
/ 14 апреля 2020

Когда я пытаюсь установить значение в BufferedImage с именем dinoImage в Dino. java в конструкторе, я просто получаю пустой экран каждый раз (второе изображение), потому что repaint() не вызывается, но если я устанавливаю его в нуль он работает просто отлично, но без этого изображения (первое изображение).
Без исключений, все выглядит нормально в этом коде, эта проблема возникает, когда я пытаюсь установить значение в этом поле, используя stati c метод getImage of Resource. java, который использует эту строку кода ImageIO.read(new File(path)) и это приводит к тому, что repaint() не вызывается, я думаю, эта строка вызывает такое странное поведение, но я не знаю, как ее решить.

Working one Blank Screen

Main. java

public class Main {

    public static void main(String[] args) {

        GameWindow gameWindow = new GameWindow();
        gameWindow.startGame();

    }
}

GameWindow. java

public class GameWindow extends JFrame {

    private GameScreen gameScreen;

    public GameWindow() {
        super("Runner");
        setSize(1000, 500);
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        gameScreen = new GameScreen();
        add(gameScreen);
    }

    public void startGame() {
        gameScreen.startThread();
    }

}

GameScreen. java

public class GameScreen extends JPanel implements Runnable, KeyListener {

    private Thread thread;

    public static final double GRAVITY = 0.1;
    public static final int GROUND_Y = 300;

    private Dino dino;

    public GameScreen() {
        thread = new Thread(this);
        dino = new Dino();
    }

    public void startThread() {
        thread.start();
    }

    @Override
    public void run() {
        while(true) {
            try {
                Thread.sleep(20);
                dino.updatePosition();
                repaint();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
//      g.clearRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.RED);
        g.drawLine(0, GROUND_Y, getWidth(), GROUND_Y);
        dino.draw(g);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("Key Pressed");
        dino.jump();
    }

    @Override
    public void keyReleased(KeyEvent e) {
        System.out.println("Key Released");
    }

}

Динозавр. java

public class Dino {

    private double x = 100;
    private double y = 100;
    private double speedY = 0;
    private BufferedImage dinoImage;

    public Dino() {
        dinoImage = getImage("data/dino.png");
    }

    public void updatePosition() {
        if(y + speedY >= GROUND_Y - 100) {
            speedY = 0;
            y = GROUND_Y - 100;
        } else {
            speedY += GRAVITY;
            y += speedY;
        }
    }

    public void jump() {
        if(y == GROUND_Y - 100) {
            speedY = -5;
            y += speedY;            
        }
    }

    public void draw(Graphics g) {
        g.setColor(Color.BLACK);
        g.drawRect((int)x, (int)y, 100, 100);
        g.drawImage(dinoImage, (int)x, (int)y, null);
    }

}

Ресурс. java

public class Resource {

    public static BufferedImage getImage(String path) {
        BufferedImage image = null;
        try {
            image = ImageIO.read(new File(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return image;
    }

}

1 Ответ

1 голос
/ 14 апреля 2020
    setSize(1000, 500);
    setVisible(true);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    gameScreen = new GameScreen();
    add(gameScreen);

Компоненты качания должны быть добавлены в рамку ДО того, как рамка станет видимой. В противном случае размер панели (0, 0) и рисовать нечего.

Код должен выглядеть примерно так:

    gameScreen = new GameScreen();
    add(gameScreen);
    setSize(1000, 500);
    setVisible(true);
...