1

我一直在玩 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 的参数时,它确实绘制了移动的一个对象。有什么想法吗?谢谢

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

4

1 回答 1

2

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

如果要移动绘图,则

  • 仅使用一个 Test JPanel
  • 覆盖 JPanel 的paintComponent(...)方法,而不是paint(...)方法。
  • super.paintComponent(g)在您的paintComponent 方法覆盖中首先调用该方法。
  • 为 Test JPanel 提供公共方法以允许外部类更改位置,而无需让它们直接与该字段混为一谈。为了安全起见,将位置字段(名称应以小写字母开头)设为私有。
  • 使用 Swing Timer 定期调用此方法并更改位置,然后调用repaint()JPanel。
于 2013-05-29T02:49:35.170 回答