Невозможно добавить изображение в определенную сетку ячеек для JPanel GridLayout

У меня есть JPanel с GridLayout (5,7), и я пытаюсь добавить изображение в определенную ячейку сетки, например: (3,1). При исследовании , я понял, что есть способ, и последовал ему.

Компилируемый исходный код

package testing;

import java.io.*;
import java.util.*;
import java.security.*;
import javax.xml.bind.DatatypeConverter;
import java.lang.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

public class Testing extends JPanel {

    public static class TestPanel extends JPanel {
        TestPanel() {
            int i = 5; // num of rows
            int j = 7; // num of cols

            PanelHolder = new JPanel[i][j];
            setLayout(new GridLayout(i, j));

            for (int m = 0; m < i; m++) {
                for (int n = 0; n < j; n++) {
                    PanelHolder[m][n] = new JPanel();
                    add(PanelHolder[m][n]);
                }
            }

            File file = new File("./src/testing/Ace_Club_1_1.png");
            File file2 = new File("./src/testing/Ace_Diamond_1_1.png");

            try {
                image = ImageIO.read(file);
                image2= ImageIO.read(file2);
            } catch (IOException ie) {

            }

            ImagePanel ip = new ImagePanel(image);
            PanelHolder[3][1].add(ip); // doesnt add according to cell grid coordinates
            ImagePanel ip2 = new ImagePanel(image2);
             PanelHolder[3][3].add(ip2);

        }

        JPanel[][] PanelHolder;

        JLabel DeckLabel;
        JPanel DeckPanel;
        ImageIcon Deckimg;

        private BufferedImage image;
        BufferedImage image2;

    }


    public static class ImagePanel extends JPanel {
        ImagePanel(BufferedImage image) {
            this.i = image;

        }


        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(i, 0, 0, getWidth(), getHeight(), this);

        }

        BufferedImage i;
    }

    public static void main(String[] args) {
        TestPanel tp = new TestPanel();

        JFrame frame = new JFrame();

        frame.add(tp);
        frame.pack();
        frame.setVisible(true);

    }

}

По какой-то неизвестной причине я не могу добавить свое изображение в определенную сетку ячеек, и оно появляется в неправильной ячейке сетки, я также не могу добавить более 1 изображения.

Вы можете скачать изображения с здесь

РЕДАКТИРОВАТЬ: отредактировал исходный код, чтобы включить ответ Эндрю Томпсона, чтобы добавить более 1 изображения, но все еще не работает

Это результат после добавления второго изображения по совету Эндрю Томпсона.

введите здесь описание изображения


person Computernerd    schedule 23.04.2014    source источник
comment
..он появился не в той ячейке сетки В какой ячейке сетки он появился? 1,3?   -  person Andrew Thompson    schedule 23.04.2014
comment
Кстати, один из подходов к этому — заполнить GridLayout JButton[][] или JLabel[][] и установить значок для соответствующего компонента.   -  person Andrew Thompson    schedule 23.04.2014
comment
@AndrewThompson он появился в ячейке сетки (5,3), вы можете скомпилировать код, который я разместил   -  person Computernerd    schedule 23.04.2014
comment
вы можете скомпилировать код, который я разместил Конечно, но я не могу запустить его и заставить его работать так, как вы его видите, потому что у меня нет изображения. Один из способов получить изображения для примера — горячая ссылка на изображения, показанные в этом ответе. .   -  person Andrew Thompson    schedule 23.04.2014
comment
@AndrewThompson Готово, я уже связал изображения   -  person Computernerd    schedule 23.04.2014
comment
Я уже связал изображения Нет, я не сказал «связать» с изображениями, я сказал связать по горячим ссылкам с изображениями. Я не буду вдаваться в какую-то ерунду, связанную с загрузкой изображений в определенное место для проверки кода, доступ к ним осуществляется по URL-адресу непосредственно в коде.   -  person Andrew Thompson    schedule 23.04.2014


Ответы (1)


ImagePanel ip = new ImagePanel(image);
PanelHolder[3][1].add(ip); // doesnt add according to cell grid coordinates
PanelHolder[3][3].add(ip); // only 1 image appears 

1 компонент может отображаться только в одном месте в графическом интерфейсе. Если вам нужно отобразить 2, создайте 2.

person Andrew Thompson    schedule 23.04.2014
comment
второе изображение отображается неправильно, это просто маленькая точка - person Computernerd; 23.04.2014