Как поменять изображения у нескольких JPanel?

280
05 июня 2017, 22:47

Есть класс ImageImport, унаследованный от JPanel:

package engine;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class ImageImport extends JPanel {
    private static final long serialVersionUID = 1L;
    private BufferedImage img;
    public ImageImport(String imageName) {
        try {  
            img = ImageIO.read(this.getClass().getResourceAsStream("/Cards/"+imageName+".png"));
        } catch (IOException ex) {
            System.out.println(ex.toString());
        }
    }
     @Override
     protected void paintComponent(Graphics g) {
         super.paintComponent(g);
         g.drawImage(img, 0, 0, this);         
     }
}

Созданные на основе этого класса панели прекрасно отображают загруженные изображения. Панели хранятся в главном классе Table в:

public ArrayList<JPanel> cardsJPanels = new ArrayList<>();

и все принадлежат главной панели mainPanel.
В третьем классе Engine пытался через промежуточный массив сделать так:

private Table table;
public void newGame(){
    ArrayList<JPanel> buffCardsJPanels = new ArrayList<>();
    JPanel buffJP;
    for (int i=0; i<=8; i++){
        buffJP = new ImageImport(deck.get(i));
        buffCardsJPanels.add(buffJP);
    }
    table.cardsJPanels.addAll(0, buffCardsJPanels);
    table.mainPanel.repaint();
}

Ошибок никаких нет, программа загружается. По кнопке newGame() не делает ничего.
UPDATE: Сам понял, что обновлял только массив, не затрагивая mainPanel.

Answer 1

Решил проблему.
1. Очистил table.cardsJPanels от старых значений.
2. Передал в массив Component[] весь перечень элементов, которые лежат на mainPanel.
3. Пробежался по массиву, и если элемент = элементу типа ImageImport - удалить с панели по порядковому номеру i.
ВАЖНО: порядковый номер i при совпадении надо уменьшить на 1, так как при удалении элемента из панели все его элементы сдвигаются "вниз" по нумерации.
4. Пересоздал все элементы и заново их расположил в mainPanel.

public void newGame(){
    JPanel buffJP;
    int i=0;
    table.cardsJPanels.clear();
    Component[] с = table.mainPanel.getComponents();
        for (Component j: с){
            if (j instanceof ImageImport) {
                table.mainPanel.remove(i);
                i--;
            }
            i++;
        }
        for (i=1; i<=9; i++){
            buffJP = new ImageImport(Integer.toString(deckNumbers_2.get(i-1)));
            buffJP.setBounds(CARD_XY_LEFT.get(i*10+1).intValue(), CARD_XY_LEFT.get(i*10+2).intValue(), 
                    CARD_WIDTH, CARD_HEIGHT);
            buffJP.setOpaque(false);
            table.cardsJPanels.add(buffJP);
            table.mainPanel.add(table.cardsJPanels.get(i-1));
        }
        table.mainPanel.repaint();
    }
READ ALSO
Быстро вставить 1 000 000 значений в mysql [дубликат]

Быстро вставить 1 000 000 значений в mysql [дубликат]

На данный вопрос уже ответили:

384
URL при работе на локальном сервере(Ajax, Spring)

URL при работе на локальном сервере(Ajax, Spring)

Есть веб-приложение на Spring MVC, клиентская сторона посылает Ajax запросы на сервер

355
Android - socket.io посыл данных всем клиентам в виде byte[]

Android - socket.io посыл данных всем клиентам в виде byte[]

ЗдравствуйтеМоя проблема в том, что я никак не соображу в чем именно может быть проблема

429