gpt4 book ai didi

java - 图形中的多个独立层

转载 作者:行者123 更新时间:2023-12-01 10:14:33 25 4
gpt4 key购买 nike

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

示例:

  1. 在底层绘制红色实心圆圈
  2. 在顶层绘制绿色矩形
  3. 在底层绘制红色填充矩形
  4. 在顶层绘制绿色圆圈

期望的结果:两个空的绿色对象应该渲染在两个填充的红色对象上方。

我用JLayeredPane摆弄和Canvas我能得到的最接近的是 CanvasJComponent 之上但不幸的是Canvas背景不能是透明的,因此 JComponent 中绘制的所有内容涵盖于Canvas背景。

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

最佳答案

有几种方法可以做到这一点。您可以保留 BufferedImages 列表作为图像层并相应地渲染它们:

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

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

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

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

上面的代码将按照列表中的 BufferedImage 添加到列表的顺序渲染它们。如果您不想在每次重绘时绘制所有图层,则可以随时添加另一个 draw(Graphics g) 方法,您可以选择要绘制到另一个 BufferedImage 上的图层。然后只在 paintComponent(g) 上绘制这个 BufferedImage。

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

您可以随时调整我的示例中的小细节来定制您需要的内容。

<小时/>

添加图层:

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

使用BufferedImage.TYPE_INT_ARGB,背景将是透明的,因此其他图层将能够“透过”。

关于java - 图形中的多个独立层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35974972/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com