Java 为什么我的卡片是空白的?
我已经用java创建了一个Soitaire游戏,但是当我编译应用程序(没有错误)时,由于某种原因,卡最终是空的 下面是包含图形的部分代码 在Card.java中Java 为什么我的卡片是空白的?,java,graphics2d,Java,Graphics2d,我已经用java创建了一个Soitaire游戏,但是当我编译应用程序(没有错误)时,由于某种原因,卡最终是空的 下面是包含图形的部分代码 在Card.java中 import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.geom.RoundRectangle2D; imp
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JPanel;
public class Card extends JPanel {
/**
* defines all values of rank a card can achieve
*/
public enum Rank {
Ace, One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King
}
/**
* defines all values of color a card can achieve
*/
public enum Suit {
HEARTS, DIAMONDS, CLUBS, SPADES
}
private Rank cardRank; ///< will store the rank of our card
private Suit cardColor; ///< will store the color of our card
private boolean faceUp; ///< determines which side the card is facing
private Point location; ///< location of our card on board, has to be stored individually
private Point where; ///< location of Card to others
/// @2DD coordinates
private int x = 0;
private int y = 0;
/// offsets for cards
private final int x_offset = 10;
private final int y_offset = 20;
private final int new_x_offset = x_offset + (CARD_WIDTH - 30);
/// constants for card graphical view
final static public int CARD_WIDTH = 100;
final static public int CARD_HEIGHT = 150;
final static public int ANGLE = 25;
/**
* Defines a sample card object that specifies it's parameters
*
* @param defRank - pre-defined rank
* @param defColor - pre-defined color
*/
public Card(Rank defRank, Suit defColor){
cardRank = defRank;
cardColor = defColor;
faceUp = false;
location = new Point();
x = 0;
y = 0;
location.x = x;
location.y = y;
where = new Point();
}
/* Function for drawing out a card Color
*
* @param defColor - defines which card color (symbol we want)
* @param defColorCode - defines which actual color code should be used for the symbol
*/
private void drawSuit(Graphics2D g, String defColor, Color defColorCode)
{
g.setColor(defColorCode);
g.drawString(defColor, location.x + x_offset, location.y + y_offset);
g.drawString(defColor, location.x + x_offset, location.y + CARD_HEIGHT - 5);
}
/**
* similar as color, but instead of symbol we draw the value
* @see drawColor for more info
*/
private void drawRank(Graphics2D g, String defRank){
g.drawString(defRank, location.x + new_x_offset, location.y + y_offset);
g.drawString(defRank, location.x + new_x_offset, location.y + y_offset + CARD_HEIGHT - 25);
}
/**
* basically acts as a main for the Card. Creates card with graphical display
*
* @param g2d - utilizes java graphic library to draw compotents of our defined functions
*/
public void createCard(Graphics g2d){
Graphics2D g = (Graphics2D) g2d; ///< konvertujeme do 2d grafiky
RoundRectangle2D rect = new RoundRectangle2D.Double(location.x, location.y, CARD_WIDTH, CARD_HEIGHT, ANGLE, ANGLE);
g.setColor(Color.WHITE);
g.fill(rect);
g.setColor(Color.BLACK);
g.draw(rect);
if (faceUp == true){
switch(cardColor){
case HEARTS:
drawSuit(g, "Hearts", Color.RED);
break;
case DIAMONDS:
drawSuit(g, "Diamonds", Color.RED);
break;
case CLUBS:
drawSuit(g, "Clubs", Color.BLACK);
break;
case SPADES:
drawSuit(g, "Spades", Color.BLACK);
break;
}
int new_x_offset = x_offset + (CARD_WIDTH - 30);
switch (cardRank){
case Ace:
drawRank(g, "Ace (A)");
break;
case Two:
drawRank(g, "Two (2)");
break;
case Three:
drawRank(g, "Three (3)");
break;
case Four:
drawRank(g, "Four (4)");
break;
case Six:
drawRank(g, "Six (5)");
break;
case Five:
drawRank(g, "Five (6)");
break;
case Seven:
drawRank(g, "Seven (7)");
break;
case Eight:
drawRank(g, "Eight (8)");
break;
case Nine:
drawRank(g, "Nine (9)");
break;
case Ten:
drawRank(g, "Ten (10)");
break;
case Jack:
drawRank(g, "Jack (J)");
break;
case Queen:
drawRank(g, "Queen (Q)");
break;
case King:
drawRank(g, "King (K)");
break;
}
} // end of if
else { ///< ked je karta otocena spodkom
RoundRectangle2D rect2D = new RoundRectangle2D.Double(location.x, location.y, CARD_WIDTH, CARD_HEIGHT, ANGLE, ANGLE);
g.setColor(Color.LIGHT_GRAY);
g.fill(rect2D);
g.setColor(Color.BLACK);
g.draw(rect2D);
} // end of else
} // end of function
} // end of file (class Card.java)
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Point;
导入java.awt.Rectangle;
导入java.awt.geom.RoundRectangle2D;
导入javax.swing.JPanel;
公共类卡扩展JPanel{
/**
*定义一张卡可以达到的等级的所有值
*/
公共枚举等级{
ACE,一,二,三,四,五,六,七,八,九,十,杰克,皇后,金
}
/**
*定义卡可以实现的所有颜色值
*/
公开枚举诉讼{
红心、钻石、梅花、黑桃
}
private Rank cardRank;//<将存储我们卡的等级
private Suit cardColor;//<将存储我们卡的颜色
private boolean faceUp;//<确定卡面向哪一侧
专用点位置;//<我们卡在板上的位置必须单独存储
私人点;//<向其他人提供卡的位置
///@2DD坐标
私有整数x=0;
私有整数y=0;
///卡的抵消
专用最终整数x_偏移=10;
专用最终整数y_偏移=20;
私有最终整数新的x偏移=x偏移+(卡片宽度-30);
///卡图形视图的常量
最终静态公共int卡_宽度=100;
最终静态公共int卡_高度=150;
最终静态公共内角=25;
/**
*定义用于指定其参数的示例卡对象
*
*@param defRank-预定义的秩
*@param defColor-预定义颜色
*/
公共卡(等级defRank,套装defColor){
cardRank=defRank;
cardColor=defColor;
faceUp=false;
位置=新点();
x=0;
y=0;
位置x=x;
位置y=y;
其中=新点();
}
/*用于绘制卡片颜色的函数
*
*@param defColor-定义所需的卡颜色(符号)
*@param defColorCode-定义符号应使用的实际颜色代码
*/
私人void抽衣(Graphics2D g、String defColor、Color defColorCode)
{
g、 setColor(defColorCode);
g、 抽绳(defColor,location.x+x_偏移,location.y+y_偏移);
g、 抽绳(defColor,location.x+x_偏移,location.y+CARD_高度-5);
}
/**
*与颜色相似,但我们绘制的是值而不是符号
*@有关详细信息,请参阅drawColor
*/
私有void drawRank(Graphics2D g,字符串碎片整理){
g、 抽绳(defRank,location.x+新的x\u偏移,location.y+y\u偏移);
g、 抽绳(反存盘,位置.x+新的x\U偏移,位置.y+y\U偏移+卡片高度-25);
}
/**
*基本上作为卡的主界面。创建带有图形显示的卡
*
*@param g2d-利用java图形库绘制我们定义函数的组件
*/
公共创建卡(图形g2d){
Graphics2D g=(Graphics2D)g2d;//
在CardStack.java中
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Color;
import java.awt.Graphics2D;
import java.util.ListIterator;
import java.util.Stack;
import java.util.Collections;
import javax.swing.*;
import java.awt.geom.RoundRectangle2D;
/**
* We decided to fuse CardDeck with CardStack. CardDeck can contain multiple card stacks
*
* @param isDeck - a boolean that checks if we want a deck or only a stack. Deck contains all cards
*/
public CardStack(boolean isDeck) {
deck = new Stack<Card>();
this.setLayout(null);
if(isDeck) {
for (Card.Suit suit : Card.Suit.values()) {
for (Card.Rank rank : Card.Rank.values()) {
deck.push(new Card(rank, suit));
}
}
} else
playStack = true;
}
/**
* Paints the entire component, similar to card
*
* @see Card
* @param g - utilizes Graohic library.
*/
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (playStack) {
removeAll();
ListIterator<Card> iter = deck.listIterator();
Point prev = new Point(); /// positioning relative to the container
Point prevWhereAmI = new Point();/// abs positioning on the board
if (iter.hasNext()) {
Card c = iter.next();
//// this origin is point(0,0) inside the cardstack container
prev = new Point();/// c.getXY(); /// starting deck pos
add(Solitaire.moveCard(c, prev.x, prev.y));
/// setting x & y position
c.setWhere(getXY());
prevWhereAmI = getXY();
} else {
removeAll();
}
for (; iter.hasNext(); ) {
Card c = iter.next();
c.setXY(new Point(prev.x, prev.y + SPREAD));
add(Solitaire.moveCard(c, prev.x, prev.y + SPREAD));
prev = c.getXY();
/// setting x & y position
c.setWhere(new Point(prevWhereAmI.x, prevWhereAmI.y + SPREAD));
prevWhereAmI = c.getWhere();
}
}
}
protected void paintComponent(Graphics g, boolean isFinalStack)
{
removeAll();
if (!emptyStack())
{
add(Solitaire.moveCard(this.peekLast(), 1, 1));
} else
{
/// draw back of card if empty
Graphics2D g2d = (Graphics2D) g;
RoundRectangle2D rect = new RoundRectangle2D.Double(0, 0, Card.CARD_WIDTH, Card.CARD_HEIGHT,
Card.ANGLE, Card.ANGLE);
g2d.setColor(Color.LIGHT_GRAY);
g2d.fill(rect);
g2d.setColor(Color.black);
g2d.draw(rect);
}
}
导入java.awt.Graphics;
导入java.awt.Point;
导入java.awt.Rectangle;
导入java.awt.Color;
导入java.awt.Graphics2D;
导入java.util.ListIterator;
导入java.util.Stack;
导入java.util.Collections;
导入javax.swing.*;
导入java.awt.geom.RoundRectangle2D;
/**
*我们决定将CardDeck与CardStack融合。CardDeck可以包含多个
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import src.ija.Card;
import src.ija.CardStack;
/// GUI COMPONENTS (top level)
private static final JFrame frame = new JFrame("IJA Klondike Solitaire");
protected static final JPanel table = new JPanel();
/// other components
private static JEditorPane gameTitle = new JEditorPane("text/html", "");
private static JButton showRulesButton = new JButton("Show Rules");
private static JButton newGameButton = new JButton("New Game");
private static JButton toggleTimerButton = new JButton("Pause Timer");
private static JTextField scoreBox = new JTextField();/// displays the score
private static JTextField timeBox = new JTextField();/// displays the time
private static JTextField statusBox = new JTextField();/// status messages
private static final Card newCardButton = new Card();/// reveal waste card
private static void playNewGame()
{
deck = new CardStack(true); /// deal 52 cards
deck.shuffle();
table.removeAll();
/// reset stacks if user starts a new game in the middle of one
if (playCardStack != null && final_cards != null)
{
for (int x = 0; x < NUM_PLAY_DECKS; x++)
{
while(!playCardStack[x].emptyStack()){
playCardStack[x].popStack();
}
}
for (int x = 0; x < NUM_FINAL_DECKS; x++)
{
while(!final_cards[x].emptyStack()){
final_cards[x].popStack();
}
}
}
/// initialize & place final (foundation) decks/stacks
final_cards = new CardStack[NUM_FINAL_DECKS];
for (int x = 0; x < NUM_FINAL_DECKS; x++)
{
final_cards[x] = new CardStack(false, true);
final_cards[x].setXY((FINAL_POS.x + (x * Card.CARD_WIDTH)) + 10, FINAL_POS.y, true);
table.add(final_cards[x]);
}
/// place new card distribution button
table.add(moveCard(newCardButton, DECK_POS.x, DECK_POS.y));
/// initialize & place play (tableau) decks/stacks
playCardStack = new CardStack[NUM_PLAY_DECKS];
for (int x = 0; x < NUM_PLAY_DECKS; x++)
{
playCardStack[x] = new CardStack(false);
playCardStack[x].setXY((DECK_POS.x + (x * (Card.CARD_WIDTH + 10))), PLAY_POS.y);
table.add(playCardStack[x]);
}
/// Dealing new game
for (int x = 0; x < NUM_PLAY_DECKS; x++)
{
int hld = 0;
Card c = deck.popStack().turnFaceUp();
playCardStack[x].putFirst(c);
for (int y = x + 1; y < NUM_PLAY_DECKS; y++)
{
playCardStack[y].putFirst(c = deck.popStack());
}
}
/// reset time
time = 0;
newGameButton.addActionListener(new NewGameListener());
newGameButton.setBounds(0, TABLE_HEIGHT - 70, 120, 30);
showRulesButton.addActionListener(new ShowRulesListener());
showRulesButton.setBounds(120, TABLE_HEIGHT - 70, 120, 30);
gameTitle.setText("<b>IJA Solitaire</b> <br>");
gameTitle.setEditable(false);
gameTitle.setOpaque(false);
gameTitle.setBounds(245, 20, 100, 100);
scoreBox.setBounds(240, TABLE_HEIGHT - 70, 120, 30);
scoreBox.setText("Score: 0");
scoreBox.setEditable(false);
scoreBox.setOpaque(false);
timeBox.setBounds(360, TABLE_HEIGHT - 70, 120, 30);
timeBox.setText("Seconds: 0");
timeBox.setEditable(false);
timeBox.setOpaque(false);
startTimer();
toggleTimerButton.setBounds(480, TABLE_HEIGHT - 70, 125, 30);
toggleTimerButton.addActionListener(new ToggleTimerListener());
statusBox.setBounds(605, TABLE_HEIGHT - 70, 180, 30);
statusBox.setEditable(false);
statusBox.setOpaque(false);
table.add(statusBox);
table.add(toggleTimerButton);
table.add(gameTitle);
table.add(timeBox);
table.add(newGameButton);
table.add(showRulesButton);
table.add(scoreBox);
table.repaint();
}
public static void main(String[] args)
{
Container contentPane;
frame.setSize(TABLE_WIDTH, TABLE_HEIGHT);
table.setLayout(null);
table.setBackground(new Color(0, 180, 0));
contentPane = frame.getContentPane();
contentPane.add(table);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
playNewGame();
table.addMouseListener(new CardMovementManager());
table.addMouseMotionListener(new CardMovementManager());
frame.setVisible(true);
}
}