如何在JComponent或Jpanel上绘制多个形状? [英] How to draw multiple shapes on JComponent or Jpanel?

查看:163
本文介绍了如何在JComponent或Jpanel上绘制多个形状?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试构建 Paint 应用,但是我在DrawingArea类中做错了什么. 问题是当我尝试绘制第二个形状时,第一个形状或图形是自动删除的,因此我需要一些有关如何解决此问题的想法.所有答案都可以接受. 感谢帮助.

I'm trying to build Paint app and I doing something wrong in DrawingArea class. The problem is when I try to draw second shape , the first shape or figure is auto deleting so I need to some idea about how to solve this.All answers acceptable. THANKS FOR HELP.

DrawingArea.class 代码的一部分:

There is part of DrawingArea.class codes :

    @Override // GETTING FIRST (STARTING) COORDINATE WHEN THE MOUSE PRESSED
    public void mousePressed(MouseEvent e) {
        oldX = e.getX();
        oldY = e.getY();
        repaint();

    }

    @Override // GETTING RELEASED COORDINATE TO DRAW LINE.
    public void mouseReleased(MouseEvent e) {
        lastX = e.getX();
        lastY = e.getY();
        repaint();
    }

    public void mouseClicked(MouseEvent e) {
        clickedX = true;
        COUNT = e.getClickCount();
    }

    // GETTING COORDINATE TO DRAW FILLEDRECT,FILLEDOVAL,OVAL,RECT.
    public void mouseDragged(MouseEvent e) {
        draggedX = e.getX();
        draggedY = e.getY();
        repaint();
        width = Math.abs(oldX - draggedX);
        height = Math.abs(oldY - draggedY);
        x = Math.min(draggedX, oldX);
        y = Math.min(draggedY, oldY);

    }

    public void mouseMoved(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    // CLEAR THE ALL SHAPES DRAWED ON DRAW AREA.
    public void clear() {
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, (int) this.getWidth() + 55, (int) this.getHeight() + 55);
        super.repaint();
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (image == null) {
            image = new BufferedImage((int) this.getWidth(), (int) this.getHeight(), BufferedImage.TYPE_INT_ARGB);
            g2 = (Graphics2D) image.getGraphics();
            g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            clear();
        }

        g2.drawImage(image, 0, 0, getWidth(), getHeight(), this);
        g2.dispose();

        g.setColor(initialColor);
        if (shape == Shapers.PENCIL) {
            g.setColor(currentColor);
            g.fillOval(draggedX, draggedY, thickness, thickness);

        } else if (shape == Shapers.OVAL) {
            g.setColor(currentColor);
            g.drawOval(oldX, oldY, draggedX, draggedX);

        } else if (shape == Shapers.FILLEDOVAL) {
            g.setColor(currentColor);
            g.fillOval(oldX, oldY, draggedX, draggedY);

        } else if (shape == Shapers.RECT) {
            g.setColor(currentColor);
            g.drawRect(x, y, width, height);

        } else if (shape == Shapers.FILLEDRECT) {
            g.setColor(currentColor);
            g.fillRect(x, y, width, height);

        } else if (shape == Shapers.LINE) {
            g.setColor(currentColor);
            g.drawLine(oldX, oldY, draggedX, draggedY);
            oldX = draggedX;
            oldY = draggedY;

        } else if (shape == Shapers.ERASER) {
            g.setColor(Color.WHITE);
            g.fillRect(draggedX, draggedY, thickness, thickness);

        } else if (shape == Shapers.TEXT) {
            if (clickedX == true || COUNT == 2) {
                String str = JOptionPane.showInputDialog("Write Your Text Here : ");
                g.setFont(myFont);
                g.setColor(currentColor);
                if (str != null) {
                    g.drawString(str, oldX, oldY);
                    COUNT = 0;

                } else {
                    return;
                }
            }
        } else {
            COUNT = 0;
            return;
        }

    }


}

推荐答案

您需要:

  1. 将要绘制的形状存储在列表中,然后在paintComponent()方法中绘制列表中的所有形状,或者
  2. 将形状绘制到BufferedImage上,然后仅绘制BufferedImage

查看自定义绘画方法,了解以下示例两种方法,并使用最能满足您要求的方法.

Check out Custom Painting Approaches for working examples of both approaches and use the approach that best meets your requirement.

这篇关于如何在JComponent或Jpanel上绘制多个形状?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆