简体   繁体   English

如果我使用 ImageIO.read(),则不会调用 Repaint()

[英]Repaint() not being called if i use ImageIO.read()

When i try to set value to BufferedImage called dinoImage in Dino.java in a constructor i just get a blank screen every time (second picture) because repaint() is not being called, but if i set it to null it is working just fine but without this image (first picture).当我尝试在构造函数中的 Dino.java 中将值设置为 BufferedImage 称为 dinoImage 时,我每次都会得到一个空白屏幕(第二张图片),因为没有调用repaint() ,但是如果我将它设置为 null 它工作得很好但没有这张图片(第一张图片)。
No exceptions, everything seems fine in this code, this problem appears when i try to set value to this field using static method getImage of Resource.java which uses this line of code ImageIO.read(new File(path)) and it causes that repaint() is not being called, i guess this line causes such weird behavior but i dont know how to solve it.没有例外,此代码中的一切似乎都很好,当我尝试使用 static 方法 getImage of Resource.java 为该字段设置值时出现此问题,它使用这行代码ImageIO.read(new File(path))并导致repaint()没有被调用,我猜这条线会导致这种奇怪的行为,但我不知道如何解决它。

工作一 黑屏

Main.java主.java

public class Main {

    public static void main(String[] args) {

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

    }
}

GameWindow.java游戏窗口.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游戏画面.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");
    }

}

Dino.java迪诺.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);
    }

}

Resource.java资源.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;
    }

}
    setSize(1000, 500);
    setVisible(true);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

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

Swing components need to be added to the frame BEFORE the frame is made visible.在使框架可见之前,需要将 Swing 组件添加到框架中。 Otherwise the panel has a size of (0, 0) and there is nothing to paint.否则面板的大小为 (0, 0) 并且没有可绘制的内容。

The code should be something like:代码应该是这样的:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM