我一直在玩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的参数一样,它绘制的一个对象移动了。有什么想法吗?感谢
编辑:编辑上面的代码以反映下面的内容。
答案 0 :(得分:2)
您正在以默认方式向JFrame添加两个组件。这将添加组件BorderLayout.CENTER,因此第二个组件将覆盖并模糊第一个组件。您需要阅读布局管理器以解决此问题。还可以在Swing Timers上阅读简单的动画,因为你的代码即使写得正确也不会动画。
如果您想移动图纸,那么
paintComponent(...)
方法,而不是paint(...)
方法。super.paintComponent(g)
方法。repaint()
。