重绘()不重新绘制某个对象/更新形状的xy坐标

时间:2014-01-28 20:16:54

标签: java awt repaint

基本上,在这个程序中,虫子在屏幕上移动食物。 我遇到的问题是图形“圆圈”重新绘制得很好并且在框架周围移动,但是没有任何错误被重新绘制(但是它们最初被绘制)。

我用控制台输出测试了它,并且bug的x和y坐标确实更新了,但框架中的图形没有更新。

所以我的问题是,为什么圈子的x / y会更新并重新绘制,但错误不是?

(据我所知,我正在接近以与圈子相同的方式更改错误x / y的任务) (我已经删除了一些像世界getter和setter这样的东西,然后把代码缩小了一点。实际的程序有一个movebug()方法,它以正确的方式处理错误的移动并进行命中检测。)< / p>

    public class Run extends JPanel implements ActionListener{

        double x, y, velX, velY, newx, newy;

        public Timer t;
        private static AWorld world1;
        ArrayList<Ellipse2D> graphicBugArrayList = new ArrayList<Ellipse2D>();


        public Run(){
         x = 150;
         y = 150;

         velX = 2;
         velY = 2;

         t      = new Timer(5, this);
         setWorld1(new AWorld());
         getWorld1().populatemap();
         AWorld.direction directionchecker;
         repaint();
         t.start();
        }


        public void paintComponent(Graphics g){

//Creating circle that move
            g.setColor(Color.BLACK);
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            Ellipse2D circle = new Ellipse2D.Double(x, y, 10, 10); 

//creating and drawing the bugs
            for(int i=0; i<world1.getNumberofbugs(); i++)
            {
                Ellipse2D obscircle = new Ellipse2D.Double(getWorld1().bugArrayList.get(i).getHPosition(), getWorld1().bugArrayList.get(i).getVPosition(), 14, 15);
                graphicBugArrayList.add(obscircle);
                g2.setPaint(Color.RED);
                g2.fill(graphicBugArrayList.get(i));
                g2.draw(graphicBugArrayList.get(i));
            }

//Drawing the circle that moves
            g2.setPaint(Color.BLACK);
            g2.draw(circle);

        }

        public void actionPerformed(ActionEvent arg0) {
            //Moving the circle 
            if(x<0 || x > 500)
            {
                velX = -velX;
            }

            if(y<0 || y > 500)
            {
                velY = -velY;
            }
            x += velX;
            y -= velY;

            //Test moving the bugs
    getWorld1().bugArrayList.get(i).setHPosition(getWorld1().bugArrayList.get(i).getHPosition()+1);


            repaint();

        }

    }

1 个答案:

答案 0 :(得分:2)

你永远不会清除你的graphicBugArrayList,但只会反复绘制前几个元素。在你的循环中试试这个:

        for(int i=0; i<world1.getNumberofbugs(); i++)
        {
            Ellipse2D obscircle = new Ellipse2D.Double(getWorld1().bugArrayList.get(i).getHPosition(), getWorld1().bugArrayList.get(i).getVPosition(), 14, 15);
            graphicBugArrayList.add(i, obscircle);
            g2.setPaint(Color.RED);
            g2.fill(graphicBugArrayList.get(i));
            g2.draw(graphicBugArrayList.get(i));
        }