2012-11-25 6 views
-1

응답없이 몇 가지 질문을 게시했습니다. 이 숙제는 며칠 만에 끝날 것이며, 나는 이것이 무엇이 잘못 될지 전혀 모른다. 나는 블랙 잭 게임을 만들고 있는데, 내 목표는 정말 간단하다. 화면에 카드를 그리기 만하면 점수가 무엇인지 알 수있는 레이블이 필요하다. 문제는 세 가지이며 근본 원인이 동일한 경우 일 수 있습니다.JPanel이 제대로 그려지지 않습니다.

1) 구성 요소가 배경을 올바르게 그려 내지 않습니다. setBackground을 호출하면 아무 작업도 수행되지 않고 사각형이 명시 적으로 그려 지지만 이후에는 완전히 회색으로 회색으로 덮어 쓰여서 완전히 벗어납니다.

2) 레이블에서 setText를 호출하면 새 텍스트가 교체되는 대신 이전 텍스트 위에 그려집니다.

3) 사용자가 "Hit"버튼을 누를 때마다 새 카드를 뽑아 내고 새로운 카드를 제공하는 기능이 있습니다. 카드가 자신의 위치를 ​​다시 계산하면 이전 카드는 화면에 남아 있기 때문에 같은 카드를 여러 번 볼 수 있습니다. 무슨 일이 일어나고 있는지의 스크린 샷이다 여기

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(); 
    } 


} 

: 그리고 여기

모든 것을 그립니다 JPanel의 하위 클래스에있는 코드의 http://s10.postimage.org/3kokr17o9/Screen_Shot_2012_11_24_at_6_31_39_PM.png

+0

코드를 최소화하여 재생산을 최소화 할 수 있습니까? –

답변

2

확인, 문제는 내가 선을 넣어하지 않은 것을 의 super.paintComponent(g) 기능은 CardPanel입니다. 그래서, 항상 이것을하십시오! :)

+0

+1 * "그래서, 항상해라"* 그리고 내 자신을 되풀이하지 않게하라.) – MadProgrammer

관련 문제