java上的分层绘画?

java上的分层绘画?,java,swing,draw,paint,Java,Swing,Draw,Paint,我基本上是在尝试做一些经典的“画画”(微软的程序)。但我想在绘画时使用图层。我想我可以使用JPanel组件作为层 我正在测试下面的代码。目标是用鼠标画一个矩形。拖动鼠标时,有一个临时层(temp)可在其上绘制,释放鼠标时,有一个实际层(区域)可绘制。但每次我开始画一个新的矩形,旧的就消失了。此外,如果我再次执行setVisible(false)和true,所有内容都会消失 MouseInputAdapter mia = new MouseInputAdapter() { private

我基本上是在尝试做一些经典的“画画”(微软的程序)。但我想在绘画时使用图层。我想我可以使用JPanel组件作为层

我正在测试下面的代码。目标是用鼠标画一个矩形。拖动鼠标时,有一个临时层(temp)可在其上绘制,释放鼠标时,有一个实际层(区域)可绘制。但每次我开始画一个新的矩形,旧的就消失了。此外,如果我再次执行setVisible(false)和true,所有内容都会消失

MouseInputAdapter mia = new MouseInputAdapter() {
    private int startx = 0, starty = 0, stopx = 0, stopy = 0;

    public void mousePressed(MouseEvent evt) {
        startx = evt.getX();
        starty = evt.getY();
    }

    public void mouseDragged(MouseEvent evt) {
        Graphics2D tempg = (Graphics2D) temp.getGraphics();

        int width = Math.abs(startx - evt.getX());
        int height = Math.abs(starty - evt.getY());
        int x = evt.getX(), y = evt.getY();
        if(x > startx)
            x = startx;
        if(y > starty)
            y = starty;

        Rectangle r = new Rectangle(x, y, width, height); 
        tempg.clearRect(0, 0, getWidth(), getHeight());
        tempg.draw(r);
    }

    public void mouseReleased(MouseEvent evt) {
        Graphics2D g = (Graphics2D) area.getGraphics();
        stopx = evt.getX();
        stopy = evt.getY();

        int width = Math.abs(startx - stopx);
        int height = Math.abs(starty - stopy);
        int x = startx, y = starty;
        if(x > stopx)
            x = stopx;
        if(y > stopy)
            y = stopy;

        Rectangle r = new Rectangle(x, y, width, height);
        g.draw(r);
    }
};
area.addMouseListener(mia);
area.addMouseMotionListener(mia);
temp.addMouseListener(mia);
temp.addMouseMotionListener(mia);

该代码有什么问题?

每次重新绘制时,不能保证在离开时得到相同的图形

两个步骤是两个步骤:

  • 在类中创建矩形列表
  • 在鼠标侦听器中,将矩形添加到列表中,而不是在图形中绘制
  • 覆盖paintComponent,并在其中绘制所传递图形的矩形列表
使用列表很好,因为列表开头的项目将被绘制在末尾的项目下面。

软件在目标位图上运行。您可以在
paintComponent()
中渲染多个
s,正如@Keily建议的
矩形
s

或者,您可能想看看软件,概述。

这里有一个大致的想法:(我假设您指的是photoshop中的图层)

为绘图设置一个JPanel

创建包含绘图所需的所有可绘图对象的数据结构

在这个数据结构中,还要创建一个包含整数的字段,该整数表示特定的可绘制对象绑定到哪个层


在paintComponent()方法中,检查哪个层当前处于活动状态,并且只绘制该层或其下的数据。

这就是我要找的

我的错误;在paintComponent()中使用getGraphics()方法,并希望保留更改


为什么@Keilly的答案对我不起作用;因为如果我将形状放在列表或数组中,当形状发生更改时(例如,删除圆的1/4),我无法更新列表中的元素。因为它不再是同一个形状了。因此,我必须将形状作为图纸保存,而且我不必(也不想)将它们分开保存。

但我处理的不仅仅是矩形。将有很多随机形状,也许我会删除一个层的一部分,它可以包含这些形状的一部分。如果每次我都能保持整个图层图形的发布,我想编码会更容易,内存也会更轻。但是我不知道怎么做。问:那代码有什么问题?A:getGraphics()如果形状在列表中,则可以从任何位置修改它。该列表只指向您赋予它的对象,因此保留对它们的引用,并对每个单独的形状执行您喜欢的操作。