2013-04-09 65 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