gpt4 book ai didi

java - 如何在 JPanel 上保存图形的当前状态

转载 作者:搜寻专家 更新时间:2023-11-01 03:51:37 26 4
gpt4 key购买 nike

<分区>

我有一个程序允许用户使用 Graphics 添加矩形和圆形到 JPanel。我想要做的是将当前 JPanel 的当前状态(即所有形状及其位置)保存到一个文件中,并能够加载该文件并恢复该状态。我有一个 Shapes 类,它扩展 JPanel 并完成所有绘图并使用 ArrayList 跟踪形状。

我可以简单地保存面板的状态吗?还是我必须将形状数据保存到文件中并在“打开”文件时重新绘制形状?

谁能指导我如何保存 JPanel 的当前状态并重新打开它?谢谢

public class UMLEditor {

public static void main(String[] args) {

JFrame frame = new UMLWindow();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(30, 30, 1000, 700);
frame.getContentPane().setBackground(Color.white);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setVisible(true);

}
}

class UMLWindow extends JFrame {
Shapes shapeList = new Shapes();

public UMLWindow() {
addMenus();
}

public void addMenus() {

getContentPane().add(shapeList);

JMenuBar menubar = new JMenuBar();
JMenu file = new JMenu("File");
JMenuItem openMenuItem = new JMenuItem("Open File");
openMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
// Open saved state
});

JMenuItem saveMenuItem = new JMenuItem("Save");
saveMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
// Save current state
}
});

file.add(openMenuItem);
file.add(saveMenuItem);

JMenu shapes = new JMenu("Shapes");
file.setMnemonic(KeyEvent.VK_F);

JMenuItem rectangleMenuItem = new JMenuItem("New Rectangle");
rectangleMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
shapeList.addSquare(100, 100);
}
});

JMenuItem circleMenuItem = new JMenuItem("New Circle");
circleMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
shapeList.addCircle(100, 100);
}
});

shapes.add(rectangleMenuItem);
shapes.add(circleMenuItem);

menubar.add(file);
menubar.add(shapes);

setJMenuBar(menubar);

setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

}

// Shapes class, used to draw the shapes on the panel
// as well as implements the MouseListener for dragging
class Shapes extends JPanel {
private static final long serialVersionUID = 1L;

private List<Path2D> shapes = new ArrayList<Path2D>();
int currentIndex;

public Shapes() {
MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
addMouseListener(myMouseAdapter);
addMouseMotionListener(myMouseAdapter);
}

public void addSquare(int width, int height) {
Path2D rect2 = new Path2D.Double();
rect2.append(new Rectangle(getWidth() / 2 - width / 2, getHeight() / 2
- height / 2, width, height), true);

shapes.add(rect2);
repaint();

}

public void addCircle(int width, int height) {
Path2D rect2 = new Path2D.Double();
rect2.append(new Ellipse2D.Double(getWidth() / 2 - width / 2,
getHeight() / 2 - height / 2, width, height), true);

shapes.add(rect2);
repaint();
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.setOpaque(true);
this.setBackground(Color.WHITE);
Graphics2D g2 = (Graphics2D) g;
for (Path2D rect : shapes) {
g2.draw(rect);
}
}

class MyMouseAdapter extends MouseAdapter {
private boolean pressed = false;
private Point point;

@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() != MouseEvent.BUTTON1) {
return;
}
for (int i = 0; i < shapes.size(); i++) {
if (shapes.get(i) != null
&& shapes.get(i).contains(e.getPoint())) {
currentIndex = i;
pressed = true;
this.point = e.getPoint();
}
}
}

@Override
public void mouseDragged(MouseEvent e) {
if (pressed) {
int deltaX = e.getX() - point.x;
int deltaY = e.getY() - point.y;
shapes.get(currentIndex).transform(
AffineTransform.getTranslateInstance(deltaX, deltaY));
point = e.getPoint();
repaint();
}
}

@Override
public void mouseReleased(MouseEvent e) {
pressed = false;
}
}
}

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