gpt4 book ai didi

java - 将 JPanel 保存为 .jpg/.png 图像

转载 作者:行者123 更新时间:2023-11-30 04:27:15 26 4
gpt4 key购买 nike

我制作了一个 Java Applet,将用户在 JPanel 中绘制的内容保存在图像上。当我保存输出图像时,我只有 JPanel 的背景,用户绘制的线条消失了。有什么解决办法吗?在此代码行中,程序已绘制了该行,但错误仍然存​​在。

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;

public class MarkPen extends Applet implements ActionListener, AdjustmentListener, MouseListener, MouseMotionListener {

private int x = 0;
private int y = 0;
private int prevx = 0;
private int prevy = 0;

private JPanel drawPanel = new JPanel();
private JButton saveButton = new JButton("SaveImage");

public void init()
{

setLayout(new BorderLayout());

drawPanel.setBackground(Color.red);
drawPanel.addMouseMotionListener(this);
drawPanel.addMouseListener(this);
drawPanel.add(new Comp());
drawPanel.setDoubleBuffered(true);
add(drawPanel, "Center");

saveButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
BufferedImage image = new BufferedImage(drawPanel.getWidth(), drawPanel.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = image.createGraphics();

drawPanel.paint(graphics2D);
try{
ImageIO.write(image,"jpeg", new File("C:/.../Example.jpeg"));
}
catch(Exception ex){
ex.printStackTrace();
}
}
});

add(saveButton, "South");

}

public void setGraphicalDefaults(MouseEvent e){}

public class Comp extends JComponent{
public void paintComponent(Graphics g) {
g = drawPanel.getGraphics();
g.setColor(Color.black);
g.drawLine(0,0,100,100);
}
}

public void mouseDragged(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void actionPerformed(ActionEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseMoved(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
public void adjustmentValueChanged(AdjustmentEvent arg0){}

}

感谢您的帮助,我解决了这个问题,我在下面发布了工作代码。

工作代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JPanel;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JApplet;
import javax.swing.SwingUtilities;

public class MarkPen extends JApplet {

private static final long serialVersionUID = 1L;

public static class DrawPanel extends JPanel {

private static final long serialVersionUID = 1L;
private List<Point> points = new ArrayList<Point>();

public DrawPanel() {
setBackground(Color.WHITE);

addMouseMotionListener(new MouseAdapter() {

@Override
public void mouseDragged(MouseEvent e) {
points.add(e.getPoint());
repaint();
}
});

addMouseListener(new MouseAdapter(){

@Override
public void mousePressed(MouseEvent e){
Point p = null;
points.add(p);
}
});

}

@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}

@Override
protected void paintComponent(java.awt.Graphics g) {
super.paintComponent(g);
Point p1 = null;
Point p2 = null;
g.setColor(Color.black);
for (Point p : points) {
p2 = p1;
p1 = p;
if (p1 != null && p2 != null) {
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
}
}
}

protected void initUI() {
setLayout(new BorderLayout());

JButton saveButton = new JButton("SaveImage");
JButton clearButton = new JButton("Clear");
final DrawPanel drawPanel = new DrawPanel();
JPanel buttonsPanel = new JPanel();

buttonsPanel.setLayout(new BorderLayout());
setSize(1000, 305);
add(drawPanel, "Center");

saveButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
BufferedImage image = new BufferedImage(drawPanel.getWidth(), drawPanel.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = image.createGraphics();

drawPanel.paint(graphics2D);
try{
ImageIO.write(image,"png", new File("C:/.../Desktop/Example.png"));
}
catch(Exception ex){
ex.printStackTrace();
}
}
});

clearButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
drawPanel.points.clear();
repaint();
}
});

buttonsPanel.add(clearButton, BorderLayout.WEST);
buttonsPanel.add(saveButton, BorderLayout.EAST);
add(buttonsPanel, BorderLayout.SOUTH);

validate();
}

@Override
public void init() {
super.init();
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
initUI();
}
});
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

最佳答案

  • 您的问题是由于使用drawPanel.getGraphics();

  • 此方法可以创建临时对象用于将 JPanel 保存到图像,而不是用于在 JPanel 中显示图像

  • 重写 public class Comp extends JComponent{

  • 中的 getPreferredSize
  • drawImage 位于 paintComponent

  • 如果您想替换当前绘画,请使用super.paintComponent

例如

class Comp extends JComponent {

private static final long serialVersionUID = 1L;

@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bi, 0, 0, this);
}
}

关于java - 将 JPanel 保存为 .jpg/.png 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15565328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com