java – 绘制一个在下一个绘画中不会消失的矩形

我试图创建一个绘制矩形的JPanel.小组需要绘制很多矩形,但它们不会移动.
我的问题的一个解决方案是创建一个包含我已经创建的所有矩形的列表,并在每次调用“Paint”时绘制它们.但是有很多矩形,它会减慢计算机的速度.
我也尝试使用重绘(x,y,高度,宽度)来清理新矩形的空间,但它不起作用. (JPanel不断擦除以前的矩形.)
在排序中,我需要绘制每个油漆都不会消失的矩形.或者是一种不会擦除先前绘制的绘画方法,或者不会绘制背景.
这是我的JPanel类的一部分:
class MyPanel extends JPanel{
  private int x,size;
  private Color c;
  public void DrawRect(int x,int y,int size,Color c){
      this.x = x;
      this.y = y;
      this.size = size;
      this.c = c;
      repaint();
  }
  @Override
    public void
    paint(Graphics g) {

        g.setColor(c);
      g.fillRect(x,size,size);
    }

}

解决方法

>不要在没有非常的情况下覆盖绘画,非常好的理由……使用paintComponent代替
>总是打电话给super.paintXxx,这些方法后台做了很多,没有打电话给超级只会回来困扰你.
>如果您使用多个窗格作为矩形,请使MyPanel透明.

油漆是无国籍的.最后一个油漆和下一个油漆之间没有任何联系.在每个绘制请求中,您需要更新整个状态.

安德鲁建议的双缓冲(或后缓冲)是非常好的,我强烈建议你看一下实现它.

与此同时,我把这个小例子放在一起……

基本上,您按住鼠标按钮,它将每40毫秒(大约每秒25帧)随机添加一个矩形到面板.

我没有任何问题得到了1000个rects,能够调整窗口大小没有发出或明显减慢…

public class MyPanel extends JPanel {

    private List<MyRectangle> lstShapes;
    private Timer populate;

    public MyPanel() {

        lstShapes = new ArrayList<MyRectangle>(25);

        populate = new Timer(40,new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                int x = (int) (Math.random() * getWidth());
                int y = (int) (Math.random() * getHeight());
                int width = (int) (Math.random() * (getWidth() / 4));
                int height = (int) (Math.random() * (getHeight() / 4));

                if (x + width > getWidth()) {
                    x = getWidth() - width;
                }
                if (y + height > getHeight()) {
                    y = getHeight() - height;
                }

                Color color = new Color(
                        (int) (Math.random() * 255),(int) (Math.random() * 255),(int) (Math.random() * 255));

                lstShapes.add(new MyRectangle(x,width,height,color));
                repaint();
            }
        });
        populate.setinitialDelay(0);
        populate.setRepeats(true);
        populate.setCoalesce(true);

        addMouseListener(new MouseAdapter() {
            @Override
            public void mousepressed(MouseEvent e) {
                populate.restart();
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                populate.stop();
            }
        });

    }

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;
        for (MyRectangle rect : lstShapes) {
            rect.paint(g2d);
        }

        FontMetrics fm = g2d.getFontMetrics();
        String text = Integer.toString(lstShapes.size());

        g2d.setColor(getForeground());
        g2d.drawString(text,getWidth() - fm.stringWidth(text),getHeight() - fm.getHeight() + fm.getAscent());

    }

    public class MyRectangle extends Rectangle {

        private Color color;

        public MyRectangle(int x,int width,int height,Color color) {
            super(x,height);
            this.color = color;
        }

        public Color getColor() {
            return color;
        }

        public void paint(Graphics2D g2d) {

            g2d.setColor(getColor());
            g2d.fill(this);

        }
    }
}

一个去,很有趣;)

ps-在我注意到减速之前我达到了超过5000个矩形(我将代码修改为10毫秒延迟并且每个滴答添加10个新矩形)

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...