2013-04-09 62 views
0

目前我正在尝试制作视频扑克。到目前为止,它由2个类组成: 具有int值,char套装和检查布尔值的卡片。卡是JButton。然后用一堆卡片对象装饰甲板。为什么我的JButton不更新imageicon?

将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")); 
      } 
     } 
    } 
+0

你有任何错误消息,堆栈跟踪或任何? – mthmulders 2013-04-09 07:28:20

+0

不,没有。在添加(e.getSource()instanceof Card)之前,我得到一个ClassCastException。但我认为这是无关紧要的,所以不是。 – Eric 2013-04-09 07:31:53

+0

您是否真的到过卡片被“翻转”的地方以显示其原始图像? – mthmulders 2013-04-09 07:35:49

回答

0

它看起来像问题是由不添加新绘制卡到电动扑克面板造成的。在平局事件的处理,该卡阵列中的项目可以更换,但这些卡/按钮目标没有被添加到面板:

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]); 

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

您也可以更改您的设计并使用具有卡片参考的CardButton,而不是将卡片作为按钮。这样,你可以有五个固定的CardButtons,并让这些引用正确的Card对象,使得按钮和卡片的耦合更少。

+0

我可以发誓我试过了。但显然不是。谢谢!也许位置排序不会太糟糕。 – Eric 2013-04-09 09:00:10

+0

我想弄清楚如何将Card分成两类。我可以看到这样做的原因,但我不明白这在实施方面意味着什么。 CardButton扩展卡?或CardButton有一张卡片卡,并扩展JButton?我想如果我能把它分成两个班,我可以消除定位问题。 (我有一个如何解决的想法,但我真的不想去那里。) – Eric 2013-04-09 09:46:29

+0

把它分成两类,找到了解决方案。非常感谢你的帮助。 – Eric 2013-04-09 10:31:38