可以分层ImageIcons吗?

时间:2012-02-10 11:45:32

标签: java swing gif imageicon

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

当某个条件成立时,我需要能够在另一个图像的顶部添加一个透明的图像。

此致 杰克亨特

4 个答案:

答案 0 :(得分:5)

您只需使用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 :(得分:5)

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

1)如果只有一张图片,则将JLabelIcon一起放入GlassPane

2)使用LayeredPane用于< = Java6(不是Java7用户,有JLayer)

答案 2 :(得分:4)

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

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

答案 3 :(得分:4)

您可以使用Overlay Layout将JLabel叠加在一起。

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