JPanel не перерисовывается через таймер

1

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

public class Frogger extends JPanel {

    private static final int WINDOW_WIDTH = 640;
    private static final int WINDOW_HEIGHT = 480;

    private static final Entity frog;
    private static final Entity car;

    static {
        frog = new Entity("sprites/frog.png", WINDOW_WIDTH / 2 - 75, WINDOW_HEIGHT - 190);
        car = new Entity("sprites/car.png", 0, WINDOW_HEIGHT / 2);
    }

    private static KeyListener genGameListener() {
        return new KeyListener() {
            @Override
            public void keyPressed(KeyEvent e) {}

            @Override
            public void keyReleased(KeyEvent e) {
                switch (e.getKeyCode()) {
                    case KeyEvent.VK_LEFT:
                        frog.move(-50, 0);
                        System.out.println("lol");
                        break;
                }
            }

            @Override
            public void keyTyped(KeyEvent e) {}
        };
    }

    @Override
    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.WHITE);
        frog.draw(g2d);
        car.draw(g2d);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Frogger!");
        Frogger frogger = new Frogger();
        frogger.addKeyListener(genGameListener());
        frogger.setFocusable(true);
        frame.add(frogger);
        frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Timer timer = new Timer(100, (ActionEvent e) -> {
            car.move(50, WIDTH);
            frogger.repaint();
        });
    }
}

С классом Entity как таковым:

public class Entity {

    private BufferedImage sprite;

    private final AffineTransform at;

    private final int width;
    private final int height;

    private int x;
    private int y;

    public Entity(String imageFileName, int x, int y) {
        sprite = null;
        try {
            this.sprite = ImageIO.read(new File(imageFileName));
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
        width = sprite.getWidth();
        height = sprite.getHeight();
        this.x = x;
        this.y = y;
        at = new AffineTransform();
        at.translate(x, y);
    }

    public void draw(Graphics2D g) {
        g.drawImage(sprite, at, null);
    }

    public void rotate(int radians) {
        at.rotate(radians);
    }

    public void move(int dx, int dy) {
        x += dx;
        y += dy;
        at.translate(dx, dy);
    }
...

Тем не менее, мои ключевые действия не обновляют спрайты, и автомобиль не перемещается по экрану, как это запланировано Timer. Почему не перерисовывается рамка?

  • 2
    private static final Entity frog; <- Плохая идея, static не твой друг; new KeyListener() { <- Плохая идея, KeyListener is troublesome at the best of times, use key bindings instead; public void paint (Graphics g) {`<- Обычно это не очень хорошая идея, но поскольку вы не называете super.paint , это действительно плохая идея. Вместо этого переопределите paintComponent и убедитесь, что вы вызываете super.paintComponent
  • 0
    Вот как наш профессор сказал нам делать такие вещи; благодарю вас! Я расскажу об этом подробнее в следующий раз, когда сделаю что-то подобное, так как не знаю, как исправить то, что вы сказали.
Теги:
swing
jframe

1 ответ

3
Лучший ответ

Вы никогда не вызываете start() на свой объект Timer.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню