【问题标题】:How to prevent JPanel from repainting everything?如何防止 JPanel 重新绘制所有内容?
【发布时间】:2014-10-27 09:33:04
【问题描述】:

通过将鼠标点保存在数组列表中来制作一个类似于绘画的应用程序。我的想法是有一个包含所有先前绘制的东西的“点”数组列表,以及一个“临时”数组列表来获取和修改用户刚刚输入的当前画笔笔触。这是必要的,因为用户可以更改颜色和大小,所以我的想法是根据按下的按钮修改当前的笔触,然后将该笔触添加到图片的其余部分。我在 StackOverflow 周围搜索并找到了一些代码,但无法让它按我想要的方式工作(假设我找到了正确的代码)。

@Override
public void paintComponent(Graphics g1) {
    super.paintComponent(g1);
    final Graphics2D g = (Graphics2D)g1.create();
    try {
        g.setColor(brushColor);
        for (Point point : tempArrayList){
            g.fillOval(point.x, point.y, brushSize, brushSize);
        }

    } finally {
        g.dispose();
    }

问题是我需要为下一个画笔笔划清除 tempArrayList,当他们更改颜色/大小时我可以这样做,但随后它会擦除以前存在的内容。我开始认为我什至不需要上面描述的“点”数组列表,因为我希望 g1 图形只会保存 g 图形创建的内容。

我想我只需要弄清楚如何将 g 图形添加到 g1

【问题讨论】:

  • "如何防止 JPanel 重新绘制所有内容?" 绘制到 BufferedImage 并在标签中显示。
  • @AndrewThompson 你能告诉我怎么做吗?或者链接到另一个类似的 SE 问题?
  • 这是一个recent example 在缓冲图像中制作动画。 WorldView 源是另一个例子。两者都是 MCVE。

标签: java swing arraylist


【解决方案1】:

绘制由 Swing API 控制,期望每当调用paintComponent 时,您将重新绘制组件的整个状态(因为您的组件的一部分可能由于某些系统事件而损坏),所以简短的回答是,不,你不能......但是......

你可以...

改为绘制BufferedImage,并在调用paintComponent 时绘制BufferedImage

你可以...

建立一系列“可绘制”对象,其中包含有关要绘制的内容以及绘制方式的信息,包括画笔描边、描边颜色和填充颜色。

然后这些将被添加到某种 List 并在调用 paintComponent 方法时“绘制”

【讨论】:

  • 是的,目前我的paintComponent 有大约12 个for 循环。基本上我有 12 个数组列表(4 种颜色和 3 种大小,因此每种颜色有 1 个大小),并且每次调用 repaint 时重绘都会遍历每个数组列表并重新创建它。我意识到这是可怕的代码,所以我正在寻找一种清理它的方法,而不是使用缓冲图像。如果我想走那条路,你能告诉我如何在上面的答案中使用缓冲图像吗?
【解决方案2】:

查看Custom Painting Approaches 的绘画示例:

  1. 对象列表
  2. 缓冲图像。

示例展示了如何绘制不同颜色的矩形。

【讨论】:

    猜你喜欢
    • 2011-05-03
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2019-04-17
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多