【问题标题】:Adding multiple Images on top of each other using transparency使用透明度将多个图像叠加在一起
【发布时间】:2018-05-04 12:42:58
【问题描述】:

是否可以将多个图像添加到单个JPanel 并使用顶部Image透明度 通道来查看底层Image

【问题讨论】:

  • 当您使用一系列graphics.drawImage(...) 调用绘制多个图像(其中具有透明度)时,应该已经考虑了透明度。你能解释一下什么真正的问题是什么?
  • "是否可以将多个图像添加到单个JPanel 并使用顶部Image透明度 通道来查看底层@987654330 @?" 是的。 一般提示:1) 为了尽快获得更好的帮助,请发布minimal reproducible exampleShort, Self Contained, Correct Example。 2) 例如,获取图像的一种方法是热链接到在this Q&A 中看到的图像。

标签: java image swing jpanel


【解决方案1】:

您可以,但如果您创建自己的 JPanel 版本来扩展 JPanel 类会更容易。创建JPanel 的子类并覆盖paint 方法。在paint 方法中,只需将一张图像绘制在另一张图像上即可。

public class MiPanel extends JPanel {
  List<Image> images;

  ...

  void addIMage( Image im) {
    images.add( im)
  }

  @Override
  public void paint( Graphics g) {
    Graphics2D g2d = (Graphics2D)g;

    ...
    for ( Image im :images) {
      g2d.drawImage( im, 0,0, null);
    }
    ...
  }

创建一个List 来存储图像以及将图像添加到列表中的方法。然后,在paint 方法中,绘制所有图像。当然,如果图像具有透明度,您将能够看到“下方”图像。如果您即时创建图像,请记住使用带有 Alpha 通道的 Color。如果您从文件中加载图像,我建议您使用 PNG。

【讨论】:

  • (1-) 自定义绘画是通过覆盖paintComponent(...) 而不是paint() 完成的。什么是“iconImage.getDecoration()”?
  • iconIMage...抱歉。从一个真实的例子中复制和粘贴。在这种情况下,最好使用“paint”而不是“paintComponent”,因为覆盖paintComponent 您有一个纯色背景(或设置setOpaque(false)),但使用paint 您可以完全控制所绘制的内容。如果您扩展 JFrame 而不是 JPanel,您可以使用相同的方法,这就是我在自己的应用程序中复制代码的示例。
  • 不,你不应该重写paint()。你在你的代码中做什么取决于你,但论坛的目的是促进标准的 Java 实践,这将防止将来出现问题。例如,在您的方法中,您无法向组件添加边框。 2)背景也应该总是被画出来,否则你可能会有绘画制品。这在处理透明绘画时尤其重要。
  • 好吧,如果您绘制背景,您将看不到面板下方的内容。您不知道用户是否正在创建类似于半透明消息框的东西,这是 Swing 应用程序中任何透明事物的最常见用途。应该调用paintCompnent 而不是paint,因为paint 中有很多剪辑工作,例如,您应该在覆盖的paint 中复制它们,但如果重点是制作一些特别的东西,比如透明的东西, 覆盖paint 是可以的。但是好吧,你赢了,使用paintComponent和一个不透明的背景来制作透明的东西......
  • 这与获胜无关。它是关于理解绘画如何在 Swing 中工作的。如果您不想绘制背景,则使用setOpaque(false)。如果您有一个不透明的组件并且您不绘制背景,则可能会导致绘制伪影。有关此主题的更多信息,请参阅Backgrounds With Transparency。另请参阅Swing Painting Guidelines,了解有关在 Swing 中绘画的更详细讨论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
相关资源
最近更新 更多