JPanel上绘制的线条最小化窗口后就消失了
时间: 2023-12-04 10:05:55 浏览: 66
这是因为在最小化窗口后,窗口会被系统销毁并重新创建,原先绘制的线条也会被销毁,从而导致线条消失。要解决这个问题,可以在 JPanel 上绘制线条时,将线条的坐标转换成相对于 JPanel 的坐标,然后将这些坐标保存在一个集合中。在 JPanel 被重绘时,可以使用这些保存的坐标重新绘制线条。
以下是一个简单的示例代码,用于在 JPanel 上绘制线条并在窗口最小化后重新绘制:
```java
import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class LineDrawer extends JPanel {
private ArrayList<Point> points = new ArrayList<>();
public void addPoint(Point point) {
points.add(point);
repaint();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < points.size() - 1; i++) {
Point p1 = points.get(i);
Point p2 = points.get(i + 1);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Line Drawer");
LineDrawer lineDrawer = new LineDrawer();
frame.add(lineDrawer);
frame.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
// 添加一些点
lineDrawer.addPoint(new Point(50, 50));
lineDrawer.addPoint(new Point(100, 100));
lineDrawer.addPoint(new Point(150, 50));
lineDrawer.addPoint(new Point(200, 100));
}
}
```
这个示例代码创建了一个 LineDrawer 类,它是一个继承自 JPanel 的自定义组件,用于在其上绘制线条。在 main 方法中,我们创建了一个 JFrame 并将 LineDrawer 添加到其中。然后,我们添加了一些点来绘制线条。由于这些点是相对于 LineDrawer 的坐标,因此它们不会丢失。在 LineDrawer 中,我们重写了 paintComponent 方法,使用保存的坐标重新绘制线条。
阅读全文