【问题标题】:Animations in Java not WorkingJava中的动画不起作用
【发布时间】:2016-03-17 13:27:46
【问题描述】:

我正在尝试用 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);

    }

}

【问题讨论】:

标签: java swing rendering


【解决方案1】:

不要使用KeyListener,老实说,改用Key Bindings API,它旨在解决KeyListener 造成的问题。

JPanel 中的paintComponent 做了一项重要的工作,在进行任何自定义绘画之前,您应该调用它的super 方法。

更多详情请参阅Painting in AWT and SwingPerforming Custom Painting

您还应该努力从事件调度线程的上下文中初始化您的 UI,这解决了某些平台上的一些已知问题,请参阅Initial Threads 了解更多详细信息

【讨论】:

    【解决方案2】:

    你离得并不远。首先,你需要为你的关键事件添加一个监听器。

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

    现在应该可以了!

    【讨论】:

      猜你喜欢
      • 2013-08-24
      • 2012-04-13
      • 2013-03-29
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多