为什么我的JButton不会更新imageicon?

时间:2013-04-09 07:16:18

标签: java swing jbutton imageicon

目前我正在尝试制作视频扑克。到目前为止它由2个类组成: 带有int值,char套装和布尔值检查的卡片。卡是一个JButton。然后Deck拿着一堆Card对象。

VideoPoker课程中的JButton不会更新ImageIcon 当我画卡时,我无法弄清楚为什么我的生活。它在我想要背景图像时更新它,然后在我想要原始图像时再次更新它,那么为什么不换新卡呢?

下面是我的代码

import javax.swing.*;
import java.awt.event.*;

public class VideoPoker extends JPanel implements ActionListener {

    private Deck deck;
    private Card[] cards;
    private JButton draw;
    private final int MAXCARDS = 5;

    public VideoPoker() {
        deck = new Deck();
        cards = new Card[MAXCARDS];
        for(int i = 0; i < MAXCARDS; i++) {
            cards[i] = deck.Draw();
            cards[i].addActionListener(this);
            add(cards[i]);
            cards[i].setIcon(new ImageIcon
                            ("Cards/" + cards[i].getValue() +
                            cards[i].getSuit() + ".png"));
        }
        draw = new JButton("Draw");
        draw.addActionListener(this);
        add(draw);
    }

    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == draw) {
            int checked = 0;
            for(int i = 0; i < MAXCARDS; i++) {
                if(cards[i].getChecked()) {
                    cards[i] = deck.Draw();
                    cards[i].setIcon(new ImageIcon
                            ("Cards/" + cards[i].getValue() + 
                            cards[i].getSuit() + ".png"));
                    checked++;
                }
            }
        }
        if(e.getSource() instanceof Card) {
            Card source = (Card)e.getSource();
            if(!source.getChecked()) {
                source.setChecked(true);
                source.setIcon(new ImageIcon("Cards/back.png"));
            }
            else {
                source.setChecked(false);
                source.setIcon(new ImageIcon
                        ("Cards/" + source.getValue() +
                        source.getSuit() + ".png"));
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

看起来问题是由于未将新绘制的卡片添加到VideoPoker面板而引起的。处理绘制事件时,可以替换卡片阵列中的项目,但这些卡片/按钮对象尚未添加到面板中:

public void actionPerformed(ActionEvent e) {
    if(e.getSource() == draw) {
        int checked = 0;
        for(int i = 0; i < MAXCARDS; i++) {
            if(cards[i].getChecked()) {
                cards[i] = deck.Draw();
                cards[i].setIcon(new ImageIcon
                        ("Cards/" + cards[i].getValue() + 
                        cards[i].getSuit() + ".png"));
                checked++;
            }
        }
    }
    if(e.getSource() instanceof Card) {
        // ...
    }
}

当您在获取新卡之前从面板中取出旧卡并在此之后将新卡添加到面板时,卡也会在屏幕上更改。

                remove(cards[i]);
                cards[i] = deck.Draw();
                add(cards[i]);

还有一些工作要做,因为需要将卡添加到正确的位置。

您也可以更改您的设计,并使用卡片引用卡片,而不是使用卡片作为按钮。这样你就可以拥有五个固定的CardButtons,让它们引用正确的Card对象,使得按钮和卡片的连接不那么紧密。