我正在实现一个简单的方法,可以像现实生活中用纸和铅笔一样绘制项目,而无需在每次绘制对象时清除整个页面。Canvas到目前为止,我有什么...A实现图纸:Canvaspublic class Canvas extends JPanel { private final Random random = new Random(); public Canvas() { setOpaque(false); // I thought setting this flag makes the drawn pixels be preserved... } @Override public Dimension getPreferredSize() { return new Dimension(640, 480); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.drawOval(random.nextInt(getWidth()), random.nextInt(getHeight()), 5, 5); }}作为实际窗口:Windowpublic class Window extends JFrame { public Window(Canvas canvas) { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); add(canvas); pack(); setVisible(true); }}以及应用程序的入口点。还启动一个计时器,以便每秒调用 on 以强制绘制另一个圆圈。ControllerrepaintCanvaspublic class Controller { public static void main(String[] args) { Canvas canvas = new Canvas(); SwingUtilities.invokeLater(() -> new Window(canvas)); new Timer(1000, e -> canvas.repaint()).start(); }}问题是,每当画一个新圆圈时,前一个圆圈就会被清除。似乎仍然有一些过程填充或整个白色。JPanelJFrame
2 回答

拉丁的传说
TA贡献1789条经验 获得超8个赞
在《摇摆》中绘画是破坏性的。期望的要求是,每次对组件进行涂漆时,都要再次从头开始涂漆。
您需要定义一个模型来维护所需的信息,以便从头开始恢复状态。
然后,您的绘画例程将迭代此模型并每次绘制元素。
这样做的好处是允许您修改模型,删除或插入元素,这将允许您简单地更新所绘制的内容。
或者,您可以使用“缓冲区”(即)来完成所有绘制,然后每次绘制组件时,只需将图像绘制到组件上即可。BufferedImage
但是,这意味着您无法撤消或分层绘画,而是直接绘制到图像上。它还使调整绘图图像区域的大小变得更加困难,因为您需要手动进行这些更新,而基于“模型”的实现更具适应性

catspeake
TA贡献1111条经验 获得超0个赞
考虑调用重绘 (...) 的替代构造函数
重绘(长 tm, int x, int y, int 宽度, int 高度)
这允许您设置要重绘的指定区域。
此外,您只需将绘制的内容存储在列表中,然后在调用重绘后将绘图重新打印到画布上。
添加回答
举报
0/150
提交
取消