Рисование и позиционирование нескольких 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 для всех ваших карт. Затем вы можете добавить метки на панель, используя соответствующий менеджер макета.
Если вы хотите, чтобы ваши карты перекрывали друг друга, вы можете использовать макет перекрытия.