【问题标题】:Trying to display Circles moving down but cannot remove circles drawn before试图显示向下移动的圆圈但无法删除之前绘制的圆圈
【发布时间】:2016-06-28 05:09:04
【问题描述】:

我正在尝试制作重力的效果,但它看起来就像是有越来越多的圆圈条纹,而不是单个圆圈向下移动。我不知道如何删除我已经绘制的圆圈。顺便说一句,代码中没有错误。

import javax.swing.Timer;
import javax.swing.*;

import java.awt.*;
import java.util.*;
import java.awt.event.*;
import java.awt.geom.Ellipse2D;
public class Tester {


    static JFrame frame;
    static JPanel panel;
    static JButton button;
    static ArrayList<Ellipse2D.Double> circles = new       ArrayList<Ellipse2D.Double>();

    static void init(){
        frame = new JFrame();
        panel = new JPanel(new BorderLayout());
        button = new JButton("South");
        panel.add(button, BorderLayout.SOUTH);

        frame.add(panel);

        frame.setVisible(true);
        panel.setVisible(true);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setBackground(Color.LIGHT_GRAY);



}

public static void main(String[] args) {
     init();

class MeteorMover extends JPanel{

         Ellipse2D.Double m;
         int x = 40,y=40;
         boolean isSettingGravity=true;

         public MeteorMover(){
             m = new Ellipse2D.Double(x,y,30,30);

         }

         void createNewMeteor(int n){
            repaint(); 
         }

         void setGravity(){
             isSettingGravity = true;
             for (int i=0;i<circles.size();i++){
                 Ellipse2D.Double m = circles.get(i);
                 m= new Ellipse2D.Double(m.getX(),m.getY()+1,30,30);
                circles.set(i, m);

             }
             repaint();
         }

         protected void paintComponent(Graphics g){
             Graphics2D g2 = (Graphics2D) g;
             g2.setColor(Color.WHITE);
             if (isSettingGravity){
             for (Ellipse2D.Double c:circles){
                g2.draw(c); 
             }
             isSettingGravity = false;
             }
             else{
             m = new Ellipse2D.Double(x,y,30,30);
             circles.add(m);


             g2.fill(m);
             g2.draw(m);

             Random r = new Random();
             x = r.nextInt(500);
             y=r.nextInt(100);
             }

         }

     }

     final MeteorMover m = new MeteorMover();
     panel.add(m);
     panel.repaint();


     class TimerListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent arg0) {

             m.createNewMeteor(1);
        }

     }
     TimerListener cListener = new TimerListener();
     Timer timer = new Timer(1000,cListener);
     timer.start();

     class TimerListener2 implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent arg0) {

            m.setGravity();
        }

     }



     TimerListener2 gListener = new TimerListener2();
     Timer gTimer = new Timer(100,gListener);
     gTimer.start();

}

}

【问题讨论】:

标签: java swing graphics


【解决方案1】:

致电super.paintComponent(g);

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

阅读更多关于super.paintComponent 的信息。

【讨论】:

    【解决方案2】:

    graphics 没有直接擦除的方法,你有两个选择:

    1. 如果您始终知道需要擦除哪个椭圆,并且这些椭圆永远不会相交,那么您可以记住下一个要擦除的椭圆并调用g.setColor(bgColor); g.fill(erasedEllipse);

    2. 这个选项更可靠,你可以保留一个ArrayList 的椭圆来绘制。你可以清除所有窗格并重新绘制所有 ArrayList 中的省略号,如果你想删除一个,你 只需拨打ArrayList.remove(erasedElipseIndex)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      相关资源
      最近更新 更多