加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 03:16:02 所属栏目:Java 来源:网络整理
导读:我试图创建一个绘制矩形的JPanel.小组需要绘制很多矩形,但它们不会移动. 我的问题的一个解决方案是创建一个包含我已经创建的所有矩形的列表,并在每次调用“Paint”时绘制它们.但是有很多矩形,它会减慢计算机的速度. 我也尝试使用重绘(x,y,高度,宽度)来清理新
我试图创建一个绘制矩形的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个新矩形)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读