【问题标题】:Possible to layer ImageIcons?可以分层 ImageIcons 吗?
【发布时间】:2012-03-02 21:24:45
【问题描述】:

我想知道是否可以在 Java 中分层 ImageIcons。我将使用 GIF 图像,并将有一个 ImageIcon 网格代表我的 JPane 的“背景”。

当某个条件成立时,我需要能够在另一个图像之上添加具有透明度的图像。

问候, 杰克亨特

【问题讨论】:

  • 正如您从答案中看到的那样:前往罗马的多种方式 :-) 选择哪一种,取决于您的具体情况。

标签: java swing gif imageicon


【解决方案1】:

是的,这是可能的,有两种正确的方法

1) 如果只有一张图片,则将JLabel 和Icon 放入GlassPane

2) 将LayeredPane 用于

【讨论】:

  • +1,但是关于 a) paranoid-android 和垃圾神的答案 不正确 是什么。 b) 将整个批次渲染为单个BufferedImage,该BufferedImage 添加到标签并在需要时更新?似乎有很多方法可以给这只猫剥皮。 ;)
  • @Andrew Thompson 即使你删除了你的答案有趣的想法,pleeeeeeeeeeeeeeeaaaaaaaaaaase 示例
  • 当我看到 PA 对同一想法的更好描述时,我决定删除它。至于示例代码,我避免使用它,因为在 SO 中有很多“接近变体”(我真的应该做其他事情;)。
  • 或者你的意思是'b'的例子?
  • @AndrewThompson 这真是个好主意。每当更新背景时有效地拍摄快照。我认为这取决于背景变化的频率(或方式)。如果它快速变化,那将没有多大意义。几乎没有,那么是的,这将是理想的。 :) +1。
【解决方案2】:

您可以简单地使用g.drawImage(...) 以覆盖paintComponent 方法将它们绘制到面板上。这将是最简单的方法。

因为您的问题提到了ImageIcon,所以如果您的 gif 是动画的,则使用它是正确的。否则,BufferedImage 通常是首选。如果您决定保留ImageIcon,则应使用paintIcon(Component c, Graphics g, int x, int y) 而不是g.drawImage(...)。

如果您想动态添加图像,请考虑将它们存储在数组或ArrayList 中,然后简单地遍历paintComponent 中的数组/列表。

例如:

JPanel panel = new JPanel(){
    @Override
    public void paintComponent(Graphics g){
       super.paintComponent(g);
       if(yourCondition){
           g.drawImage(img, x, y, this); // for example.
       }
    }
};

另一种选择是创建一个扩展 JPanel 的私有类。 例如:

public class OuterClass{
    // fields, constructors, methods etc..

    private class MyPanel extends JPanel{   
       // fields, constructors, methods etc..

       @Override
       public void paintComponent(Graphics g){
          super.paintComponent(g);
          if(yourCondition){
             g.drawImage(img, x, y, this); // for example.
          }
       }

    }
}

旁注:您需要使用 GIF 的任何特殊原因? PNG 通常更好。

编辑:(根据 Andrew Thompson 的想法)

为了拍摄背景中包含的所有图像的快照...
以下想法的变体:

BufferedImage background;

public void captureBackground(){
    BufferedImage img = GraphicsConfiguration.createCompatibleImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = img.createGraphics();
    for(ImageIcon i : imageIconArray){ // could be for(BufferedImage i : imageArray){
         i.paintIcon(this, g, 0, 0);   // g.drawImage(i, 0, 0, null);
    }
    g.dispose();
    background = img;
    // either paint 'background' or add it to your background panel here.
}

【讨论】:

  • +1 我更喜欢JLayeredPane,但我知道这适用于AlphaComposite。
【解决方案3】:

您可以使用AlphaComposite的模式来实现多种效果。有一个示例和实用程序here。

附录:请注意,平台具体实现Graphics2D 的默认复合模式是AlphaComposite.SRC_OVER,这可能是也可能不是您想要的。

【讨论】:

    【解决方案4】:

    您可以使用Overlay Layout 将 JLabels 堆叠在一起。

    或者您可以使用Compound Icon 将图标堆叠在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      相关资源
      最近更新 更多