我正在使用Java进行二十一点游戏。我有几个类(卡片,鞋子,播放器等)以及定义如下的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有定位)。
提前致谢。
答案 0 :(得分:2)
mPlayerPanel.add(playerDisp,new GridConstraints());
您正在使用GridBagLayout将DisplayCard添加到面板。问题是你的组件大小是(0,0)。
您需要覆盖DisplayCard类的getPreferredSize()
方法,以返回一个合理的值,该值基本上就是您想要绘制的图像的大小。
除了自定义绘制和管理组件的首选大小外,另一个选择是为所有卡使用带有IconImage的JLabel。然后,您可以使用适当的布局管理器将标签添加到面板。
如果您希望卡片相互重叠,可以使用Overlap Layout。