使用 Graphics2D 绘制多条线

Multiple lines are gets drawn with Graphics2D

我正在尝试开发一个将几何形状绘制到图像上并保存它们的小型应用程序。我的面板中有这段代码 class:

@Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        if (getBufferedImage() != null)
        {
            g.drawImage(getBufferedImage(), 120, 0, getBufferedImage().getWidth(), getBufferedImage().getHeight(), null);
        }

        for (Shape s : getShapes())
        {
            if (getBufferedImage() != null)
            {
                Graphics2D graphics = getBufferedImage().createGraphics();
                s.draw(graphics);
            }
        }

    }

getBufferedImage() 将 return 加载图像的 bufferedImage。 s.draw() 是我定义的相应形状 classes 中的方法。

就像在 Rectangle 中一样,它有代码:graphics.drawRect()
行:graphics.drawLine()

行Class中的方法:

@Override
public void draw(Graphics g)
{
    g.setColor(getColor());

    g.drawLine(getXAxis(), getYAxis(), getWidth() + getXAxis(), getHeight() + getYAxis());
}

这些是我重写的 MouseAdapter 方法

@Override
public void mousePressed(MouseEvent event)
{
    switch (getSelectedShape())
    {
        case Rectangle:
        {
            getShapes().add(new Rectangle(event.getX(), event.getY(), getSelectedColor(), isFilled()));
            break;
        }

        case Line:
        {
            getShapes().add(new Line(event.getX(), event.getY(), getSelectedColor()));
            break;
        }
    }

    repaint();
}

@Override
public void mouseDragged(MouseEvent event)
{
    if (event == null || event.getPoint() == null || getShapes().size() <= 0)
    {
        return;
    }

    Shape currentShape = getShapes().get(getShapes().size() - 1);

    if (currentShape == null)
    {
        return;
    }

    currentShape.mouseDragged(event.getPoint());

    repaint();
}

现在,当我绘制任何形状时,会绘制多个形状:

从绘制代码中分离 BufferedImage 的创建。

@Override
public void paintComponent(Graphics g)
{
    Graphics2D graphics = (Graphics2D) g;
    for (Shape s : getShapes()) {
        graphics.draw(shape);
    }
}

public void saveAsImage()
{
    if (bufferedImage == null) {
        // Create bufferedImage
    }

    Graphics2D graphics = nufferedImage.createGraphics();
    paint(graphics);           
    graphics.dispose();
}

当然你也可以在 paintComponent 中只绘制 bufferedImage,然后在添加一个形状时创建一个新的 bufferedImage,虽然这看起来效率低下,容易出错(当布局到其他尺寸时)。

除了需要的Graphics.dispose代码不遵守"paint fast without side-effect."

给你。

我有一些变数

private boolean start = false;
private ArrayList<Line> shapes = new ArrayList<Line>();
private Line currentLine = null;

添加鼠标处理器

MouseHandler mouseHandler = new MouseHandler();
addMouseListener(mouseHandler);
addMouseMotionListener(mouseHandler);

MouseHandler 部分。

private class MouseHandler extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON1) {
                start = true;
                currentLine = new Line();
                currentLine.setFirst(new Point(e.getX(), e.getY()));
                currentLine.setLast(new Point(e.getX(), e.getY()));
                shapes.add(currentLine);
            }
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON1) {
                start = false;
                currentLine.setLast(new Point(e.getX(), e.getY()));
                currentLine = null;
                repaint();
            }
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            if (start) {
                currentLine.setLast(new Point(e.getX(), e.getY()));
                repaint();
            }
        }
    }

还有油漆

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.black);
    for(Line line : shapes){
        g.drawLine(line.getFirst().x, line.getFirst().y, line.getLast().x, line.getLast().y);
    }
}

用于保存到 BufferedImage。

public void saveImage() throws IOException {
   BufferedImage image = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB);
   Graphics2D graphics = image.createGraphics();
   graphics.setColor(Color.black);
   for (Line line : shapes) {
            graphics.drawLine(line.getFirst().x, line.getFirst().y, line.getLast().x, line.getLast().y);
   }
   graphics.dispose();
        ImageIO.write(image, "png", new File("Beniton drawing.png"));

}

添加一个按钮并调用 saveImage()