2013-04-09 2 views
0

В настоящее время я пытаюсь сделать видеопокер. До сих пор он состоит из 2-х классов: Карточка с int value, char suit и boolean checked. Картой является JButton. Затем палубу со стопкой объектов Карты.Почему мой JButton не обновит изображение?

JButton в классе VideoPoker просто не обновит 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

У вас есть сообщение об ошибке, stacktrace или что-то еще? – mthmulders

+0

Нет, ничего. Прежде чем я добавил (e.getSource() экземпляр Card), я получал исключение ClassCastException. Но это неуместно, я думаю, нет. – Eric

+0

Вы действительно попадаете в место, где карты снова «разворачиваются», чтобы показать их исходное изображение? – mthmulders

ответ

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 и позволить им ссылаться на правильные объекты Карты, делая кнопки и карты менее плотно связанными.

+0

Я могу поклясться, что попробовал это. Видимо, нет. Благодаря! Может быть, сортировка позиции будет не слишком плоха. – Eric

+0

Я пытаюсь выяснить, как именно разбить карту на 2 класса. Я вижу причину этого, но я не понимаю, что это будет означать для реализации. CardButton расширяет карту? Или CardButton имеет карточную карту и расширяет JButton? Я думаю, что если бы я мог разбить его на 2 класса, я мог бы устранить проблему позиционирования. (У меня есть идея, как решить, но я действительно не хочу туда ехать.) – Eric

+0

Разбился на 2 класса, нашел решение. Огромное спасибо за помощь. – Eric

Смежные вопросы