gpt4 book ai didi

java - 在循环中添加 JLayeredPane 后,将显示 JLabel 上的最后一个图像

转载 作者:行者123 更新时间:2023-12-01 11:24:36 24 4
gpt4 key购买 nike

抱歉,标题不好,想不出更好的了。

我正在构建一款纸牌游戏。

下面的方法采用 Card 对象作为参数,并返回一个 JLayeredPane 和一个包含卡片图像的 JLabel。

private JLayeredPane getCardPane(Card card) {
JLayeredPane cardPane = new JLayeredPane();

GridBagLayout gblCardPane = new GridBagLayout();
cardPane.setLayout(gblCardPane);

cardImageIcon = card.getImageIcon();

JLabel lblCard = new JLabel() {
@Override
public void paintComponent(Graphics g) {
g.drawImage(cardImageIcon.getImage(), 0, 0, null);
super.paintComponent(g);
}
};

GridBagConstraints gbcLblCard = new GridBagConstraints();
cardPane.add(lblCard,gbcLblCard);

return cardPane;
}

我有一个如下所示的部分,将我手中的所有卡片添加到另一个 JLayeredPane jlpMyCards:

for (int i = 0; i < hand.getCardCount(); i++) {
JLayeredPane thisCard = getCardPane(hand.getCard(i));

//JOptionPane.showMessageDialog(null,thisCard);

jlpMyCards.add(thisCard);
}

最后将 jlpMyCards 添加到框架中。

在渲染帧上,我看到手中的所有卡片(按计数),但所有卡片都显示最后加载的图像。 - 为什么?

我尝试用打印卡片

JOptionPane.showMessageDialog(null,thisCard);

弹出对话框显示正确的图像。

注意:我猜 Card 类中的以下方法也可能会产生问题。

public ImageIcon getImageIcon() {
BufferedImage img = null;
try {
img = ImageIO.read(new File(this.getClass().getResource(
getValueAsString().toLowerCase() + "_of_"+
getSuitAsString().toLowerCase() + ".png").toURI()));
//Rescaling Image
Image dimg = img.getScaledInstance(100, 146, Image.SCALE_SMOOTH);
return new ImageIcon(dimg);
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
return null;
}

最佳答案

在循环的每次迭代中,您将值分配给字段cardImageIcon。渲染所有标签时,会在同一 cardImageIcon 对象(在上次迭代期间设置)上调用 getImage()(在其 paintComponent 方法中)。

您可以将其保留为局部变量,而不是将其保留为字段:

final ImageIcom cardImageIcon = card.getImageIcon();

JLabel lblCard = new JLabel() {
@Override
public void paintComponent(Graphics g) {
g.drawImage(cardImageIcon.getImage(), 0, 0, null);
super.paintComponent(g);
}
};

将其声明为 Final 以便在 paintComponent 方法中使用它非常重要。

也许您可以只使用 JLabel 构造函数,该构造函数将 Icon 作为构造函数中的参数:

JLabel lblCard = new JLabel(card.getImageIcon());

关于java - 在循环中添加 JLayeredPane 后,将显示 JLabel 上的最后一个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30937546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com