我想知道是否可以在Java中对ImageIcons进行分层。我将使用GIF图像,并将有一个ImageIcons网格代表我的JPane的“背景”。
当某个条件成立时,我需要能够在另一个图像的顶部添加一个透明的图像。
此致 杰克亨特
答案 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)如果只有一张图片,则将JLabel与Icon一起放入GlassPane
2)使用LayeredPane用于< = Java6(不是Java7用户,有JLayer)
答案 2 :(得分:4)
您可以使用AlphaComposite
的模式来实现各种效果。有一个示例和实用程序here。
附录:请注意,平台Graphics2D
的具体实施的默认复合模式为AlphaComposite.SRC_OVER
,可能是您想要的也可能不是。
答案 3 :(得分:4)
您可以使用Overlay Layout将JLabel叠加在一起。
或者您可以使用Compound Icon将图标叠加在一起。