Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java绘制的对象未正确更新_Java_Swing_2d_Paint - Fatal编程技术网

Java绘制的对象未正确更新

Java绘制的对象未正确更新,java,swing,2d,paint,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 protecte

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


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

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

如果要移动图形,则

  • 只使用一个测试JPanel
  • 重写JPanel的
    paintComponent(…)
    方法,而不是
    paint(…)
    方法
  • 调用
    super.paintComponent(g)
    方法是paintComponent方法重写中的第一件事
  • 给出Test-JPanel公共方法,允许外部类更改位置,而无需直接使用字段。为了安全起见,将位置字段(名称应以小写字母开头)设为私有
  • 使用Swing计时器定期调用此方法并更改位置,然后在JPanel上调用
    repaint()

是的,它不打算按原样移动。我只是在设置它们的位置并尝试旋转它们。不过,我肯定会使用您提供的列表来帮助我实现这一目标。非常感谢。有一件事-我上面所有的方法都是公开的。。。我在这里遗漏了什么吗?@PeterF:是的,你的位置字段(同样应该重新命名为“位置”,小写字母为“l”)应该是私有的,而不是公共的。但是你的
setLocation(…)
方法看起来还可以。好的,我编辑了上面的代码,我可以肯定地看到事情将如何进行。也就是说,如果我只使用一个测试,我仍然不知道如何绘制多个这种类型的对象。“我将如何完成我以前试图完成的任务?”皮特从JPanel中抽象出一个结构。为您的图形JPanel提供这些家伙的集合,然后在paintComponent方法中迭代集合中的每个项目。