【发布时间】:2012-03-02 21:24:45
【问题描述】:
我想知道是否可以在 Java 中分层 ImageIcons。我将使用 GIF 图像,并将有一个 ImageIcon 网格代表我的 JPane 的“背景”。
当某个条件成立时,我需要能够在另一个图像之上添加具有透明度的图像。
问候, 杰克亨特
【问题讨论】:
-
正如您从答案中看到的那样:前往罗马的多种方式 :-) 选择哪一种,取决于您的具体情况。
我想知道是否可以在 Java 中分层 ImageIcons。我将使用 GIF 图像,并将有一个 ImageIcon 网格代表我的 JPane 的“背景”。
当某个条件成立时,我需要能够在另一个图像之上添加具有透明度的图像。
问候, 杰克亨特
【问题讨论】:
【讨论】:
BufferedImage,该BufferedImage 添加到标签并在需要时更新?似乎有很多方法可以给这只猫剥皮。 ;)
您可以简单地使用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.
}
【讨论】:
JLayeredPane,但我知道这适用于AlphaComposite。
您可以使用AlphaComposite的模式来实现多种效果。有一个示例和实用程序here。
附录:请注意,平台具体实现Graphics2D 的默认复合模式是AlphaComposite.SRC_OVER,这可能是也可能不是您想要的。
【讨论】:
您可以使用Overlay Layout 将 JLabels 堆叠在一起。
或者您可以使用Compound Icon 将图标堆叠在一起。
【讨论】: