Java绘制的对象未正确更新

时间:2013-05-29 02:46:35

标签: java swing 2d paint

我一直在玩Java的2D绘画工具并遇到了麻烦。我试图移动对象。这是代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test extends JPanel{

private int[] location = new int[2]; 

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

g.setColor(Color.red);
g.fillArc(location[0], location[1], 100, 100, 45, 90);
g.setColor(Color.black);
g.fillArc((location[0]+50-10),(location[1]+50-10), 20, 20, 0, 360);

new Timer(2000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setLocation((location[0]+50),50);
repaint();
System.out.println("repainting");
        }
}).start();

}

public void setLocation(int x, int y){
this.location[0] = x;
this.location[1] = y;
}


public static void main(String[] args){
JFrame jf=new JFrame();
jf.setDefaultCloseOperation
(JFrame.EXIT_ON_CLOSE);
jf.setPreferredSize(new Dimension(300,500));
jf.setLocation(100,100);
jf.add(new Test());

jf.pack();
jf.setVisible(true);

}
}

这只会将两个对象中的一个绘制到屏幕上...它似乎是第二个,就像我在[1]上更改setLocation的参数一样,它绘制的一个对象移动了。有什么想法吗?感谢

编辑:编辑上面的代码以反映下面的内容。

1 个答案:

答案 0 :(得分:2)

您正在以默认方式向JFrame添加两个组件。这将添加组件BorderLayout.CENTER,因此第二个组件将覆盖并模糊第一个组件。您需要阅读布局管理器以解决此问题。还可以在Swing Timers上阅读简单的动画,因为你的代码即使写得正确也不会动画。

如果您想移动图纸,那么

  • 仅使用一个Test JPanel
  • 覆盖JPanel的paintComponent(...)方法,而不是paint(...)方法。
  • 首先在paintComponent方法覆盖中调用super.paintComponent(g)方法。
  • 为Test JPanel提供公共方法,允许外部类更改位置,而无需直接使用字段。为了安全起见,将位置字段(名称应以小写字母开头)设为私有。
  • 使用Swing Timer定期调用此方法并更改位置,然后在JPanel上调用repaint()