我正在尝试开发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();
}
现在,当我绘制任何形状时,会绘制多个形状:
答案 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()