定时器和动作在java中执行

时间:2014-03-06 20:08:28

标签: java swing timer actionlistener

所以我所要做的就是让一个球在窗户周围弹跳,但由于某种原因,虽然在日食时没有出现红旗,但是当我跑它时,它只会显示一个静止的球。

这是我到目前为止所得到的:

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class Pong extends JPanel implements ActionListener {
    int x=600, y=250, vx=5, vy=5;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Pong p = new Pong();
        JFrame f = new JFrame();
        f.setSize(1400, 700);
        f.add(p);
        f.setVisible(true);
        Timer t = new Timer(100, p);
        t.start();  
        t.addActionListener(p);
    }

    public void paintComponent(Graphics b){
        b.fillOval(x,y, 50, 50);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(y>700||y<0) {
            vy=-vy;
        }
        if(x>1400||x<0) {
            vx=-vx;
        }
        y=y+vy;
        x=x+vx;
    }
}

4 个答案:

答案 0 :(得分:4)

计时器必须要求面板重新绘制自己:

public void actionPerformed(ActionEvent e) { 
    ...
    repaint();
}

答案 1 :(得分:3)

您需要在repaint()末尾添加对actionPerformed的通话。请注意,这会导致其他绘画问题(球只会在屏幕上涂抹),因为您还需要在super.paintComponent(b);方法中调用paintComponent作为第一件事。

此外,无需致电t.addActionListener(p),因为ActionListener的调用已添加new Timer(100, p)。由于ActionListener现在实际上已经添加了两次,actionPerformed每次定时弹出两次被调用,你的球移动速度比你想象的快两倍。

另请注意,正如您目前所拥有的那样,该过程在被杀之前永远不会结束。您需要确保丢弃JFrame:

f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

并关闭您的Timer

final Timer t = new Timer(100, p);  // need to make this final to avoid compile error
f.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosed(WindowEvent e) {
        t.stop();
    }
});

我注意到我有一堆&#34; Pong&#34;测试代码后仍然运行的进程。 :)

答案 2 :(得分:0)

您需要在JPanel上致电repaint,否则我们没有任何理由重新展示自己。

public void actionPerformed(ActionEvent e) { 
    ...

    this.repaint(this.getVisibleRect());
}

(未测试的)

答案 3 :(得分:0)

修改位置后应调用重绘。例如

   public void actionPerformed(ActionEvent e) {
        if(y>700||y<0) {
             vy=-vy;
             repaint();
          }...