为了账号安全,请及时绑定邮箱和手机立即绑定

如何在不清除窗口的情况下在Swing中重新绘制?

如何在不清除窗口的情况下在Swing中重新绘制?

qq_笑_17 2022-09-14 17:42:47
我正在实现一个简单的方法,可以像现实生活中用纸和铅笔一样绘制项目,而无需在每次绘制对象时清除整个页面。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

但是,这意味着您无法撤消或分层绘画,而是直接绘制到图像上。它还使调整绘图图像区域的大小变得更加困难,因为您需要手动进行这些更新,而基于“模型”的实现更具适应性


查看完整回答
反对 回复 2022-09-14
?
catspeake

TA贡献1111条经验 获得超0个赞

考虑调用重绘 (...) 的替代构造函数

重绘(长 tm, int x, int y, int 宽度, int 高度)

这允许您设置要重绘的指定区域。

此外,您只需将绘制的内容存储在列表中,然后在调用重绘后将绘图重新打印到画布上。


查看完整回答
反对 回复 2022-09-14
  • 2 回答
  • 0 关注
  • 156 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号