Как добавить несколько одинаковых изображений в одной программе с помощью JLabel?

Я использую Swing и пытаюсь добавить картинку в программу.

field = new JFormattedTextField(formatter);

ImageIcon icon = new ImageIcon("background.png"),
          icon1 = new ImageIcon("1.png");

JLabel background = new JLabel(icon); 
JLabel firstIcon = new JLabel(icon1);

JPanel center = new JPanel(new GridLayout(0, 1));


    public void initComponents() {
          this.getContentPane().add(center, BorderLayout.CENTER);

center.add(background);

field.setBounds(50,50);
background.add(field);
background.add(fristIcon);
}

С этим кодом все работает, но при попытке добавить ту же картинку "background.add(fristIcon);" опять же я не вижу изображение добавлено первым. Каждое новое изображение удаляет последний значок.

3 ответа

Решение

Вы не можете добавить несколько раз один и тот же компонент.

Я предлагаю вам действовать так:

for(int i=0;i<N;i++){
   JLabel img=new JLabel(icon1);
   switch(i){
   case 0:
      img.setBounds(x,y,w,h);
      break;
   case 1:
      img.setBounds(x,y,w,h);
      break;
   default:
      break;
   }
   background.add();
}

N равно числу значков, которые вы хотите отобразить

Но JLabel не рекомендуется в качестве контейнера. Для этого я предлагаю вам использовать JPanel в качестве контейнера для ваших этикеток.

background - это JLabel, и вы обычно не добавляете один JLabel к другому. Но если вам нужно это сделать, обязательно предоставьте JLabel, который выступает в качестве контейнера, достойный менеджер компоновки, чтобы он умно отображал добавленные компоненты. JLabels по умолчанию не имеет макета (нулевой макет), и любой добавленный компонент должен будет указать его размер и расположение для отображения. И хотя вы могли бы сделать это - указать границы всех добавленных компонентов, я собираюсь предложить вам не делать этого, так как это делает для очень негибкого GUI то, что хотя они могут хорошо выглядеть на одной платформе, выглядят ужасно на большинстве других платформ или экранов резолюции и которые очень трудно обновлять и поддерживать. Вместо этого вы захотите изучить и изучить менеджеры компоновки, а затем вложить JPanels или другие компоненты, каждый из которых использует свой собственный диспетчер компоновки для создания приятного и сложного графического интерфейса, который хорошо смотрится на всех ОС.

Подумайте только об использовании базового FlowLayout, чтобы понять, что я имею в виду:

background.setLayout(new FlowLayout());

Обратите внимание на вас

Я хочу добавить значок поверх значка.

Вот код, который использует Graphics.drawImage() нарисовать изображение в существующем Graphics из JLabel в переопределенном paintComponent() метод.

Для получения дополнительной информации читайте встроенные комментарии.

Образец кода:

// back ground image
URL url1 = new URL(
        "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQu3FFM1kR-aeYFjJIqebgusVZNM6uG-a0F4Z_0IPopEqfSZwzBBA");
final BufferedImage bg = ImageIO.read(url1);

// foreground image
URL url2 = new URL("https://cdn1.iconfinder.com/data/icons/supermariopack/Mario.png");
final BufferedImage fg = ImageIO.read(url2);

// re size the image
final BufferedImage scaled = new BufferedImage(fg.getWidth() / 2, fg.getHeight() / 2,
        BufferedImage.TYPE_INT_RGB);
Graphics g = scaled.getGraphics();
g.drawImage(fg, 0, 0, scaled.getWidth(), scaled.getHeight(), null);
g.dispose();

// create a JLabel with back ground image
final JLabel label = new JLabel(new ImageIcon(bg)) {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // draw the foreground image
        g.drawImage(scaled, 50, 50, null);
    }
};

JOptionPane.showMessageDialog(null, label);

Приведенный выше код является измененным кодом этого поста. Как нарисовать изображение поверх другого изображения?,

Скриншот:

Другие вопросы по тегам