所以我所要做的就是让一个球在窗户周围弹跳,但由于某种原因,虽然在日食时没有出现红旗,但是当我跑它时,它只会显示一个静止的球。
这是我到目前为止所得到的:
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;
}
}
答案 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();
}...