Java中的动画无法正常工作

时间:2016-03-17 00:29:11

标签: java swing rendering

我正在尝试用Java制作一个圆形动画。我希望每按一次键就移动它,但它不起作用。我画圆圈的方式有问题吗?我在某个地方忘了repaint()

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JPanel implements KeyListener {

    int x = 300, y = 300;

    public Main() {
        super();
    }

    public void paintComponent(Graphics g) {
        g.drawOval(x, y, 300, 300);
    }



    @Override
    public void keyPressed(KeyEvent e) {
        x++;
        y++;
        repaint();
    }

    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void keyReleased(KeyEvent e) {}

    public static void main(String[] args) {

        JFrame f = new JFrame();
        f.setSize(1200, 800);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(false);
        f.add(new Main());
        f.setVisible(true);

    }

}

2 个答案:

答案 0 :(得分:1)

请不要使用KeyListener,说实话,请使用Key Bindings API,而Painting in AWT and Swing旨在解决KeyListener创建的问题。

paintComponent中的{p> JPanel做了一项重要的工作,在进行任何自定义绘画之前,您需要将其称为super方法。

有关详细信息,请参阅Performing Custom PaintingInitial Threads

您还应该努力在事件调度线程的上下文中初始化UI,这解决了某些平台上的许多已知问题,有关详细信息,请参阅{{3}}

答案 1 :(得分:0)

你不是很远。首先,您需要为您的关键事件添加一个监听器。

f.addKeyListener(new KeyAdapter() {

    @Override
        public void keyPressed(KeyEvent e) {
            m.keyPressed(e);            
        }

});

其次,您会注意到这种情况的使用' m'。这是对您的Main对象的引用。

变化:

f.add(new Main());

为:

Main m = new Main();

f.add(m);

现在应该可以了!