-1

我正在开发一个从 uno 卡片集合(甲板)中抽取卡片的程序。它应该在启动时显示第一张牌,然后每次按下“下一张牌”按钮时都会抽出另一张牌。但是,我对 GUI 很陌生,无法弄清楚我做错了什么。我在应该显示卡片文本表示的框中得到“Uno”。

package Uno;

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

public class GameFrame extends JFrame
{
private PlayingCardPanel panel;
    private JPanel field;
    private JPanel menu;

public GameFrame(){
       this.setLayout(new FlowLayout());
       this.setSize( 300, 150);
       this.setTitle("UNO");
       this.createFieldPanel();
       this.createMenuPanel();
       this.add(field);
       this.add(menu);
   }

    private void createMenuPanel(){
      menu = new JPanel();
      menu.setBounds(0,300,250,100);


      JButton drawButton = new JButton("Next Card");
      drawButton.setSize(300,200);
      drawButton.addActionListener(new drawListener());

      menu.add(drawButton);
    }

    private void createFieldPanel()
    {
        field = new JPanel();
        field.setBounds(0,0,250,200);
        panel = new PlayingCardPanel();
        field.add(panel);
    }

   private class drawListener implements ActionListener{
       public void actionPerformed(ActionEvent e){
           panel.drawCard();
       }
   }
}

    package Uno;

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

public class PlayingCardPanel extends JPanel{

    private StandardDeck playingdeck;
    private PlayingCard card;

    public PlayingCardPanel(){
        this.setPreferredSize(new Dimension(100,100));   
        playingdeck = new StandardDeck();
        playingdeck.shuffle();
        playingdeck.drawTopCard();
    }

    public void drawCard(){
        playingdeck.drawTopCard();
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        int panelWidth = this.getWidth();
        int panelHeight = this.getHeight(); 
        g.drawRoundRect(0, 0, panelWidth-1, panelHeight-1, 10, 10);
        card = playingdeck.drawTopCard();
        g.drawString(card.toString(), 75, 75);
    }
}

    package Uno;

import Uno.GameFrame;

public class GameApp{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        GameFrame aBoard = new GameFrame();
        aBoard.setVisible(true);
    }

}

    package Uno;

public class PlayingCard {

    private int number; 
    private String color;

    public int getNumber() {
            return number;
    }

    public String getColor(){
            return color;
    }

    public PlayingCard(PlayingCard card){
            number = card.getNumber();
            color = new String(card.getColor());
    }   

    public PlayingCard(int cardNumber, String cardColor){
        number = cardNumber;
        color = cardColor;       
    }
}

    package Uno;

public class PlayingCard {

    private int number; 
    private String color;

    public int getNumber() {
            return number;
    }

    public String getColor(){
            return color;
    }

    public PlayingCard(PlayingCard card){
            number = card.getNumber();
            color = new String(card.getColor());
    }   

    public PlayingCard(int cardNumber, String cardColor){
        number = cardNumber;
        color = cardColor;       
    }
}

    package Uno;

import java.util.Collections;
import java.util.Vector;

public class StandardDeck {

        protected Vector<PlayingCard> cardsVector;

        public StandardDeck(){     
            cardsVector = new Vector<PlayingCard>();
            String[] colors = {"blue","red","yellow","green"};
            for(String color : colors){
                for(int i=1;i<=9;i++){
                        cardsVector.add(new PlayingCard(i,color));
                        cardsVector.add(new PlayingCard(i,color));
                }

                cardsVector.add(new PlayingCard(0,color));

                for(int i=-3;i<0;i++){
                        cardsVector.add(new PlayingCard(i,color));
                        cardsVector.add(new PlayingCard(i,color));
                }
            }

            for(int i=0;i<4;i++){
                cardsVector.add(new PlayingCard(-4,"black"));
                cardsVector.add(new PlayingCard(-5,"black"));
            }
    }

    public int getSize(){
            return cardsVector.size();
    }

    public StandardDeck reset(){
        StandardDeck resetDeck = new StandardDeck();
        return resetDeck;
    }

    public void shuffle(){
        Collections.shuffle(cardsVector);
    }

    public PlayingCard drawTopCard(){
            return new PlayingCard(cardsVector.remove(cardsVector.size()-1));
    }
}

    package Uno;

import Uno.IPlayingCard;

public interface IDeck
{
   public void reset();
   public void shuffle();
   public IPlayingCard drawTopCard(PlayingCard card);  

}


    package Uno;

import Uno.PlayingCard;

public interface IPlayingCard extends Comparable<PlayingCard>{
   public String getColor();
   public String getNumber();
}

谢谢你的帮助!

4

1 回答 1

0

它实际上是在打印类似的东西Uno.PlayingCard@56609959——它的最后一部分被截断了,所以你只会在面板的边缘看到“Uno”。

toString()在 PlayingCard 类中缺少实现。

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    int panelWidth = this.getWidth();
    int panelHeight = this.getHeight();
    g.drawRoundRect(0, 0, panelWidth - 1, panelHeight - 1, 10, 10);
    card = playingdeck.drawTopCard();
    g.drawString(card.toString(), 75, 75);  // you're calling toString() here...
}

由于您没有实现它,它正在调用默认的 Object.toString() 方法。你可能打算在你的 PlayingCard 类中添加这样的东西?

public String toString() {
    return ""+number;
}
于 2013-04-05T20:13:53.317 回答