Возможен ли слой ImageIcons? - PullRequest
       38

Возможен ли слой ImageIcons?

3 голосов
/ 10 февраля 2012

Мне было интересно, можно ли наложить слои ImageIcons на Java. Я буду работать с GIF-изображениями, и у меня будет сетка ImageIcons, представляющих «фон» моего JPane.

Когда определенное условие выполняется, мне нужно иметь возможность добавить изображение с прозрачностью поверх другого изображения.

С уважением, Джек Хант

Ответы [ 4 ]

5 голосов
/ 10 февраля 2012

да, это возможно, и есть два правильных способа

1) если есть только одно изображение, тогда поместите JLabel с Icon в GlassPane

2) использовать LayeredPane для <= Java6 (не пользователь Java7, есть JLayer) </p>

5 голосов
/ 10 февраля 2012

Вы можете просто использовать 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 обычно лучше.

РЕДАКТИРОВАТЬ: (согласно идее Эндрю Томпсона)

Чтобы сделать снимок всех изображений, содержащихся в фоновом режиме ...
Вариант следующей идеи:

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.
}
4 голосов
/ 10 февраля 2012

Вы можете использовать Overlay Layout для укладки JLabels друг на друга.

Или вы можете использовать Compound Icon для укладки иконок поверхдругой.

4 голосов
/ 10 февраля 2012

Вы можете использовать режимы AlphaComposite для достижения различных эффектов.Здесь есть пример и утилита здесь .

Добавление: обратите внимание, что композитный режим по умолчанию для конкретной реализации платформы Graphics2D равен AlphaComposite.SRC_OVER, что может или не может быть тем, что вы хотите.

...