2012-11-25 127 views
-1

我發佈了幾個沒有任何迴應的問題。這個作業幾天後就會發布,我不知道這有什麼問題。我正在做一個二十一點遊戲,我的目標非常簡單:我只想在屏幕上畫一些卡片,還有一些標籤告訴我分數是多少。問題有三重,可能有相同的根本原因:JPanel不能正確繪製

1)組件不能正確繪製背景。調用setBackground什麼也不做,明確地畫一個矩形的作品,但隨後透過灰色透支,出於完全逃脫我的原因。

2)是當我在標籤上調用setText時,新文本將在舊文本上繪製,而不是替換它。

3)我有一個功能,每次用戶按下「點擊」按鈕時繪製一張新卡,它給了他們一張新卡。當牌重新計算他​​們的位置時,舊牌會留在屏幕上,以便您看到同一張牌的多個副本。

下面是JPanel的子類,吸引一切代碼:

package problem5.view; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 

import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

import problem5.controller.BlackJackController; 
import problem5.model.Card; 
import problem5.model.Player; 


public class CardPanel extends JPanel { 
    ArrayList<Card> crdCardsOnPanel; 
    private final int DEFAULT_PANEL_WIDTH = 600; 
    private int nCardHeight = 180; 
    private int nCardWidth = 135; 
    private int nPanelWidth; 
    private int nPanelHeight; 
    private int nDeckOffset; 
    private int nHeightOffset; 
    private int nSecondOffset; 
    private int nCardSpaceWidth; 
    private int nU; 
    private int nSecondPanelVerticalOffset; 
    private JButton btnHit; 
    private JButton btnStick; 
    private JLabel lblPlayerScore; 
    private JLabel lblDealerScore; 
    private BlackJackController bjc; 

    private int nDealerCardXCoords[]; 
    private int nPlayerCardXCoords[]; 

    public CardPanel(final BlackJackController bjc) { 
     this.bjc = bjc; 

     setLayout(null); 
     setBackground(Color.green); 

     //set button behavior 
     btnHit = new JButton("Hit");   
     btnHit.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       bjc.dealCard(getPlayer()); 
      } 
     }); 
     btnStick = new JButton("Stick"); 

     lblPlayerScore = new JLabel(); 
     lblDealerScore = new JLabel(); 

     resize(DEFAULT_PANEL_WIDTH); 
     System.out.printf("Bounds: %d, %d, %d, %d\n", 
       getBounds().x, getBounds().y, getBounds().width, getBounds().height); 

     add(btnHit); 
     add(btnStick); 
     add(lblDealerScore); 
     add(lblPlayerScore); 
    } 

    public void addCard(Card crdNew) { 
     crdCardsOnPanel.add(crdNew); 
    } 

    public void setController(BlackJackController bjc) { 
     this.bjc = bjc; 
    } 

    private BlackJackController getController(){ 
     return this.bjc; 
    } 

    public void resize(int nNewWidth) { 
     nPanelWidth = nNewWidth; 
     nU = (int) (nNewWidth/36.0); 
     nPanelHeight = nU * 10; 
     nDeckOffset = nU; 
     nHeightOffset = nU; 
     nSecondOffset = nU; 
     nCardSpaceWidth = nU * 27; 
     nCardHeight = nU * 8; 
     nCardWidth = nU * 6; 
     nSecondPanelVerticalOffset = nU * 14; 

     //set bounds of buttons and labels 
     btnHit.setBounds(new Rectangle(nDeckOffset, 
        getPlayerCardViewRectangle().y, 
        nCardWidth, nCardHeight/2)); 
     btnStick.setBounds(new Rectangle(nDeckOffset, 
        getPlayerCardViewRectangle().y + nCardHeight/2, 
        nCardWidth, nCardHeight/2)); 

     lblPlayerScore.setBounds(new Rectangle(1*nU, 11*nU, 16*nU, 2*nU)); 
     lblDealerScore.setBounds(new Rectangle(19*nU, 11*nU, 16*nU, 2*nU)); 

     //calculate positions of dealer's and player's cards 
     calculateDealerCardXCoords(); 
     calculatePlayerCardXCoords(); 


     setPreferredSize(new Dimension(nPanelWidth, 24*nU)); 
     setMinimumSize(new Dimension(nPanelWidth, 24*nU)); 

    } 

    private void updateLabels() { 
     int nPlayerScore = getController().getPlayerScore(); 
     int nDealerScore = getController().getDealerScore(); 

     lblPlayerScore.setText(getPlayer().getName() + "'s Score: " + nPlayerScore); 
     lblDealerScore.setText("Dealer's Score: "+ nDealerScore); 
    } 

    public void resize() { 
     resize(getBounds().width); 
    } 

    public Player getPlayer() { 
     return getController().getPlayer(); 
    } 

    public Player getDealer() { 
     return getController().getDealer(); 
    } 

    private void calculateDealerCardXCoords() { 
     int nNumberOfCards = getDealer().getHand().getHandSize(); 
     int xCoords[] = new int[nNumberOfCards]; 
     int nOffset; 

     if (nNumberOfCards <= 4) 
      nOffset = 7*nU; 
     else 
      nOffset = nCardSpaceWidth/nNumberOfCards; 

     for (int i=0; i<nNumberOfCards; i++) { 
      xCoords[i] = i*nOffset + nDeckOffset; 
     } 

     nDealerCardXCoords = xCoords; 
    } 

    private void calculatePlayerCardXCoords() { 
     int nNumberOfCards = getPlayer().getHand().getHandSize(); 
     int xCoords[] = new int[nNumberOfCards]; 
     int nOffset; 

     if (nNumberOfCards <= 4) 
      nOffset = 7*nU; 
     else 
      nOffset = (nCardSpaceWidth-nCardWidth)/nNumberOfCards; 

     for (int i=0; i<nNumberOfCards; i++) { 
      xCoords[i] = i*nOffset; 
     } 

     nPlayerCardXCoords = xCoords; 
    } 

    public Rectangle getDealerCardViewRectangle() { 
     Rectangle rectReturn = new Rectangle(); 
     Rectangle currentView = getBounds(); 
     rectReturn.x = currentView.x + nDeckOffset; 
     rectReturn.y = currentView.y + nHeightOffset; 
     rectReturn.height = nCardHeight; 
     rectReturn.width = nCardSpaceWidth; 
     return rectReturn; 
    } 

    public Rectangle getPlayerCardViewRectangle() { 
     Rectangle rectReturn = new Rectangle(); 
     Rectangle currentView = getBounds(); 
     rectReturn.x = currentView.x + nDeckOffset + 8*nU; 
     rectReturn.y = currentView.y + nHeightOffset + nSecondPanelVerticalOffset; 
     rectReturn.height = nCardHeight; 
     rectReturn.width = nCardSpaceWidth; 
     return rectReturn; 
    } 

    public void updateScreen() { 
     resize(); 
     updateLabels(); 

    } 

    public void paintComponent(Graphics g) 
    { 
     //draw background 
     g.setColor(new Color(15,125,1)); 
     g.drawRect(0, 0, 36*nU, 24*nU); 

     //draw dealer's cards 
     for (int i=0; i<nDealerCardXCoords.length; i++) { 
      g.drawImage(getDealer().getHand().getCards().get(i).getImage(), 
        nDealerCardXCoords[i] + getDealerCardViewRectangle().x, getDealerCardViewRectangle().y, 
        nCardWidth, nCardHeight, null, null); 
     } 

     //draw player's cards 
     for (int i=0; i<nPlayerCardXCoords.length; i++) { 
      g.drawImage(getPlayer().getHand().getCards().get(i).getImage(), 
        nPlayerCardXCoords[i] + getPlayerCardViewRectangle().x, getPlayerCardViewRectangle().y, 
        nCardWidth, nCardHeight, null, null); 
     } 

//  lblDealerScore.repaint(); 
//  lblPlayerScore.repaint(); 
    } 


} 

而這裏發生了什麼事情的截圖: http://s10.postimage.org/3kokr17o9/Screen_Shot_2012_11_24_at_6_31_39_PM.png

+0

你可以最小化你的代碼重現性最差的一塊? –

回答

2

OK,問題是,我沒有放線super.paintComponent(g)paintComponent(Graphics g)功能CardPanel。所以,一定要這樣做! :)

+0

+1表示「因此,總是這樣做」*而不是讓我重複我的自我;) – MadProgrammer