如何防止JPanel重绘一切?

时间:2014-10-26 23:04:07

标签: java swing arraylist

通过在arraylist中保存鼠标点来制作类似绘画的应用程序。我的想法是有一个"积分" arraylist与所有以前绘制的东西,以及" temp" arraylist获取并修改用户刚刚输入的当前画笔描边。这是必要的,因为用户可以更改颜色和大小,所以我的想法是根据已按下的按钮修改当前画笔笔划,然后将该画笔笔划添加到图片的其余部分。我在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,当我们改变颜色/大小时我可以这样做,但是它会删除之前的画笔笔划。我开始认为我甚至不需要"积分"如上所述的arraylist因为我希望g1图形能够保存g图形所创建的内容。

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

2 个答案:

答案 0 :(得分:0)

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

你可以......

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

你可以......

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

当调用List方法时,这些会被添加到某种paintComponent和“画”

答案 1 :(得分:0)

从以下位置查看Custom Painting Approaches作为绘画的例子:

  1. 对象列表
  2. BufferedImage。
  3. 示例显示了如何绘制不同颜色的矩形。