可以分层ImageIcons吗?

Jac*_*k H 3 java swing gif imageicon

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

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

此致,杰克亨特

rth*_*sen 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.
       }
    }
};
Run Code Online (Sandbox Code Playgroud)

另一种方法是创建一个扩展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.
          }
       }

    }
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:(根据安德鲁汤普森的想法)

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

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.
}
Run Code Online (Sandbox Code Playgroud)


mKo*_*bel 5

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

1)如果是有那么只有一个图片放的JLabel图标玻璃面板

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

  • +1,但什么是*不正确*关于a)paranoid-android和trashgod的答案.b)将整个批次渲染为一个"BufferedImage",它被添加到标签并在需要时更新?似乎有很多方法可以给这只猫留下皮肤.;) (3认同)