JavaでImageIconをレイヤー化できるかどうか疑問に思いました。GIF画像を使用し、JPaneの「背景」を表すImageIconのグリッドを作成します。
ある条件が真の場合、他の画像の上に透明度のある画像を追加できるようにする必要があります。
よろしく、ジャックハント
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.
}
}
};
もう1つの方法は、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は一般的に優れています。
編集:(アンドリュー・トンプソンの考えによると)
背景に含まれるすべての画像のスナップショットを撮るために...
次のアイデアの変形:
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.
}
はい、それは可能であり、2つの正しい方法があります
1)画像が1つしかない場合は、アイコン付きのJLabelをGlassPaneに配置します
2) <= Java6にはLayeredPaneを使用します(Java7ユーザーではなくJLayerがあります)
のモードを使用してAlphaComposite
、さまざまな効果を実現できます。ここに例とユーティリティがあります。
補遺:プラットフォームの具体的な実装のデフォルトの複合モードはであることに注意してください。これGraphics2D
はAlphaComposite.SRC_OVER
、希望するものである場合とそうでない場合があります。
オーバーレイレイアウトを使用して、JLabelを互いに積み重ねることができます。
または、複合アイコンを使用して、アイコンを互いに積み重ねることもできます。