【发布时间】:2021-04-10 17:58:07
【问题描述】:
我在将对象放置在 JPanel 中时遇到问题,其中 OverlayLayout 作为布局。我正在创造纸牌游戏,我想要的是在桌子上放一个纸牌的故事。例如,我想在船上有 10 或 12 张卡片,按放置顺序显示并具有重叠效果。这是我想要实现的以下示例:
使用当前向棋盘添加卡片的代码,当我添加最多 10 张卡片时,它看起来像:
您可以看到卡片的图形被遮挡,这使得卡片图形难以阅读。 我要添加到板上的卡片图像是自定义类的对象,它扩展了 JPanels,内部带有 BufferedImage 对象:
@SuppressWarnings("serial")
class CardImage extends JPanel
{
private BufferedImage cardImage;
private Card card;
private int index;
private boolean empty;
public CardImage(Card _card, boolean clickableCard, Color areaColor, String imagePath)
{
if (!imagePath.isEmpty()) {
try {
cardImage = ImageIO.read(new File("<path>" + imagePath));
} catch (IOException e) {
e.printStackTrace();
}
empty = false;
} else {
empty = true;
}
setSize(71, 96);
setPreferredSize(new Dimension(71, 96));
setBorder(null);
if (clickableCard) {
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
setBackground(areaColor);
card = _card;
index = 0;
}
public void setIndex(int cardIndex)
{
index = cardIndex;
}
public int getIndex()
{
return index;
}
public Card getCard()
{
return card;
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (!empty) {
g.drawImage(cardImage, 0, 0, cardImage.getWidth(), cardImage.getHeight(), this);
}
}
}
注意:我知道这看起来很难看,我稍后会更正。
我需要添加空白黑卡作为初始卡以填充历史卡组,因为当我一张一张添加卡时,如果没有添加之前的卡,它会将卡放在错误的位置。我正在使用setAlignmentX() 函数来调整卡片在 X 轴上的位置。为了添加 10 张卡片,我将对齐 X 设置为每 0.1 第一张卡片有 0.0,第二张卡片有 0.1,第三张卡片有 0.2,......当将卡片添加到空面板卡片容器时,它会移动已经放置的卡片。添加第一张卡片(对齐 X 设置为 0.0)并且最初没有添加其他卡片时,它看起来像:
然后添加新卡(对齐为 0.1)时,它会将所有卡向右移动:
添加第三张卡片(对齐为 0.3)后,它会将所有卡片再次向右移动:
所以这就是为什么我需要最初添加 10 或 5 张黑卡,以使其看起来像卡在包含面板的中心而不是从左侧添加。添加初始卡片的代码如下:
boardCardPanel.setMaximumSize(boardCardPanel.getSize());
for (int i = 0; i < 6; i++) {
CardImage ci;
ci = new CardImage(Card.CARD_10_CLUB, false, Color.black, "");
ci.setMaximumSize(ci.getSize());
ci.setAlignmentX(alignmentX);
ci.setAlignmentY(0.5f);
boardCardPanel.add(ci);
alignmentX += 0.1;
}
boardCardPanel.repaint();
boardCardPanel.setVisible(true);
setVisible(true);
alignmentX = 0f;
加一张卡的代码是:
private void putCard()
{
alignmentX = 0.0f;
try {
CardImage ci = new CardImage(Card.CARD_10_CLUB, false, Color.BLACK, "\\c"+(cardIndex+2)+".gif");
ci.setMaximumSize(ci.getSize());
boardCardPanel.add(ci, 0);
for (int i = 0; i < boardCardPanel.getComponentCount(); i++) {
((CardImage)boardCardPanel.getComponent(i)).setAlignmentX(alignmentX);
((CardImage)boardCardPanel.getComponent(i)).setAlignmentY(0.5f);
alignmentX += 0.2f;
}
if (boardCardPanel.getComponentCount() > 6) {
boardCardPanel.remove(boardCardPanel.getComponentCount()-1);
}
System.out.println(boardCardPanel.getComponentCount());
cardIndex = (cardIndex + 1) % 9;
boardCardPanel.repaint();
boardCardPanel.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
那么问题是如何使用重叠图像制作卡片历史并调整面板中的重叠缩进并在中心制作卡片历史?
【问题讨论】:
标签: java swing layout layout-manager