使用Java中的JComponent绘制和定位多个BufferedImages

时间:2013-11-16 04:22:56

标签: java swing bufferedimage jcomponent

我正在使用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有定位)。

提前致谢。

1 个答案:

答案 0 :(得分:2)

 mPlayerPanel.add(playerDisp,new GridConstraints());  

您正在使用GridBagLayout将DisplayCard添加到面板。问题是你的组件大小是(0,0)。

您需要覆盖DisplayCard类的getPreferredSize()方法,以返回一个合理的值,该值基本上就是您想要绘制的图像的大小。

除了自定义绘制和管理组件的首选大小外,另一个选择是为所有卡使用带有IconImage的JLabel。然后,您可以使用适当的布局管理器将标签添加到面板。

如果您希望卡片相互重叠,可以使用Overlap Layout