Рисование и позиционирование нескольких BufferedImages с использованием JComponent в Java

Я работаю над игрой в блэкджек на Java. У меня есть несколько классов (Card, Shoe, Player и т. Д.), А также JComponent, определенный следующим образом:

Public class DisplayCard extends JComponent {

    private ArrayList<Card> mCards;

    public DisplayCard(){
        mCards = new ArrayList<Card>();
    }

    public void append(ArrayList<Card> newCards){
        mCards = newCards;
        repaint();
    }

    public void paintComponent(Graphics g){
        for (Card card : mCards) {
            g.drawImage(card.getBuffImage(),10,10,null);
        }

    }
}

В моем классе драйверов у меня есть JPanel (mPlayerPanel). Я добавляю компонент DisplayCard в Panel, создаю массив карточек и использую append() для обновления списка. Частичная реализация:

DisplayCard playerDisp = new DisplayCard();

Shoe tableShoe = new Shoe(1);

ArrayList<Card> cards = new ArrayList<Card>();
//Adds three cards to arraylist
cards.add(tableShoe.getNextCard());
cards.add(tableShoe.getNextCard());
cards.add(tableShoe.getNextCard());

mPlayerPanel.add(playerDisp,new GridConstraints()); //need "GridConstraints" to appease Intellij
playerDisp.append(cards);

Я не получаю никаких ошибок при запуске этого кода. Тем не менее, он ничего не рисует на mPlayerPanel. Есть ли что-то очевидное, что я делаю неправильно, чтобы эти BufferedImages не рисовали (ПРИМЕЧАНИЕ: я знаю, что они, если бы они печатали, все они были бы друг над другом. Я написал код в качестве теста, чтобы нарисовать BufferedImage, прежде чем с позиционированием).

Заранее спасибо.

1 ответ

Решение
 mPlayerPanel.add(playerDisp,new GridConstraints());  

Вы добавляете свою DisplayCard на панель, используя GridBagLayout. Проблема в том, что размер вашего компонента равен (0, 0).

Вы должны переопределить getPreferredSize() метод класса DisplayCard для возврата разумного значения, которое в основном будет размером изображения, которое вы хотите нарисовать.

Вместо того, чтобы настраивать рисование и управлять предпочтительным размером вашего компонента, другой вариант - использовать JLabel с IconImage для всех ваших карт. Затем вы можете добавить метки на панель, используя соответствующий менеджер макета.

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

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