图形

时间:2016-03-13 19:49:59

标签: java swing graphics

是否可以使用Graphics拥有多个独立的绘图图层?我实际上需要两层(比如Photoshop,Gimp,Paint.NET,......),我可以在其上绘制对象,我希望顶层的所有对象都出现在底层的所有对象之上,与其中的顺序无关。绘制对象。我不能首先绘制一个图层的所有对象,然后绘制另一个图层的所有对象。

示例:

  1. 在底层绘制红色圆圈
  2. 在顶层绘制绿色矩形
  3. 在底层绘制红色填充矩形
  4. 在顶层绘制绿色圆圈
  5. 期望的结果:两个空的绿色物体应该呈现在两个填充的红色物体上方。

    我使用JLayeredPaneCanvas进行了调整,我最接近的是Canvas JComponent,但不幸的是Canvas背景不能是透明的,所以JComponent中绘制的所有内容都由Canvas背景覆盖。

    你能告诉我如何实现这个目标(如果可能的话)?

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。您可以将BufferedImages列表保留为图层,并相应地进行渲染:

class AdvancePaint extends JPanel(){
    ArrayList<BufferedImage> layers;
    //Other constructors, variables, initializations not shown

    class AdvancePaint(){
        layers = new ArrayList<BufferedImage>();
    }

    public void addLayer(BufferedImage layer){
        layers.add(layer);
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        for(BufferredImage buf : layers)  //render all layers
            g.drawImage(buf, 0, 0, width, height, null);
    }
}

上述代码将根据列表中添加的顺序从列表中呈现BufferedImage。如果您不想在每次重绘时绘制所有图层,则可以始终添加另一个draw(Graphics g)方法,您可以选择要绘制到另一个BufferedImage上的图层。然后只在paintComponent(g)上绘制这个BufferedImage。

由于图层存储为Collection,因此您始终可以通过对图层进行排序或更改其在列表中的位置来更改其渲染顺序。

您可以随时调整我的示例中的细节,以自定义您需要的内容。

添加图层:

BufferedImage layer = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
advancePaint.addLayer(layer);

使用BufferedImage.TYPE_INT_ARGB,背景将是透明的,因此其他图层将能够通过&#34;闪耀。