使用Graphics2D绘制多条线

时间:2016-06-10 09:14:52

标签: java swing graphics draw

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

@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()将返回已加载图像的bufferedImage。 s.draw()是我定义的各个形状类中的方法。

与Rectangle一样,它的代码为:graphics.drawRect()
行:graphics.drawLine()

行类中的方法:

@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();
}

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

enter image description here

2 个答案:

答案 0 :(得分:1)

从绘画代码中分离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之外,代码不遵守&#34;快速绘制而没有副作用。&#34;

答案 1 :(得分:1)

你走了。

我有一些变数

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

添加MouseHandlers

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()