2014-10-29 31 views
0

大家好,我是新來的,我是Java新手。我正在編寫一個可以玩一場戰爭遊戲的程序,並在圖形面板上顯示遊戲。我在調用War類中Card類的繪製方法時遇到了問題。例如,當試圖使用drawSpade時,我得到錯誤「無法對來自類型卡片的非靜態方法drawSpade(Graphics,int,int)進行靜態引用」。我知道有很多關於這個錯誤的帖子,但我很難理解爲什麼它在我的程序中發生,以及如何解決它。任何幫助或建議都會很棒。謝謝!試圖從另一個類中調用方法

public class War extends JFrame 
    { 

    private int card; 
    private int drawNum; 
    public int drawSuit; 
    private final int xA = 225; 
    private final int yA = 50; 


    public War() 
    { 
     Color tableGreen = new Color(50, 150, 50); 
     setBackground(tableGreen);  // Sets background color 
     setSize(800,500);    // Sets window size 
     setTitle("War");    // Sets window title 
     setLocation(50,50);    // Sets where the window appears 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     setVisible(true);    // Makes the window appear 
    } 

    int myCard() 
    { 
     Random myCard = new Random(); 
     return myCard.nextInt(13) + 1; 
    } 
    int mySuit() 
    { 
     Random mySuit = new Random(); 
     return mySuit.nextInt(4) + 1; 
    } 

    int compCard() 
    { 
     Random compCard = new Random(); 
     return compCard.nextInt(13) + 1; 
    } 
    int compSuit() 
    { 
     Random compSuit = new Random(); 
     return compSuit.nextInt(4) + 1; 
    } 


    public void cardNum() 
    { 
     if (myCard() == 1) 
     { 
      drawNum = 1; 
     } 
    } 
    public void cardSuit() 
    { 
     if (mySuit() == 1) 
     { 
      drawSuit = 1; 
     } 
    } 

    public void paint (Graphics pane) 
    { 
     drawSuit = 1; 
     drawNum = 1; 

     if (drawNum == 1) 
      Card.drawBlank(pane, xA, yA); 
      Card.drawTwo(pane, xA, yA); 

     if (drawSuit == 1) 
      Card.drawSpade(pane, 75, 100); 

    } 

    public int getDrawSuit() 
    { 
     return drawSuit; 
    } 

} 


    public class Card 
    { 
    private static final int HEIGHT = 200; 
    private static final int WIDTH = 150; 
    private final int xA = 225; 
    private final int yA = 50; 


    public void drawBlank (Graphics pane, int xA, int yA) 
    { 
     pane.setColor(Color.black); 
     pane.drawRoundRect(xA, yA, WIDTH, HEIGHT, 20, 20); 
     pane.setColor(Color.white); 
     pane.fillRoundRect(xA + 1, yA + 1, WIDTH - 1, HEIGHT - 1, 20, 20); 
    } 
    public void drawSpade (Graphics pane, int xA, int yA) 
    { 
     pane.setColor(Color.black); 
     Polygon triangle; 
     triangle = new Polygon(); 
     triangle.addPoint(xA + WIDTH + WIDTH/2, yA + HEIGHT/5); 
     triangle.addPoint(xA + WIDTH + WIDTH/2 + 5, yA + HEIGHT/3); 
     triangle.addPoint(xA + WIDTH + WIDTH/2 - 5, yA + HEIGHT/3); 
     pane.fillPolygon(triangle); 
     pane.drawOval(xA + WIDTH + WIDTH/2, yA + HEIGHT/5, 20, 20); 
     pane.fillOval(xA + WIDTH + WIDTH/2, yA + HEIGHT/5, 20, 20); 
     pane.drawOval(xA + WIDTH + WIDTH/2 - 20, yA + HEIGHT/5, 20, 20); 
     pane.fillOval(xA + WIDTH + WIDTH/2 - 20, yA + HEIGHT/5, 20, 20); 
     pane.drawOval(xA + WIDTH + WIDTH/2 - 10, yA + HEIGHT/5 - 15, 20, 20); 
     pane.fillOval(xA + WIDTH + WIDTH/2 - 10, yA + HEIGHT/5 - 15, 20, 20); 
    } 
    /** 
    * Numbers 
    */ 
    public void drawTwo (Graphics pane, int xA, int yA) 
    { 
     if (getDrawSuit() == 1 || getDrawSuit() == 2) 
      pane.setColor(Color.black); 
     else 
      pane.setColor(Color.red); 

      pane.drawString("2", xA, yA); 
    } 

    public int getDrawSuit() 
    { 
     return getDrawSuit(); 
    } 
} 
+1

我在您發佈的代碼中沒有看到'drawSpade()'的靜態調用。你是否也從別的地方打電話給它? 'Card'級在哪裏? – 2014-10-29 03:22:48

回答

0

你打電話Card.drawSpade這將是類Card的靜態方法,但它不存在。

drawSpade被聲明爲實例方法:public void drawSpade (Graphics pane, int xA, int yA)。如果你想要它是一個類方法,你需要聲明爲靜態。實際上,您需要例如Card的實例,例如,

Card c = new Card(); ... c.drawSpade(pane, 75, 100);

0

在您的例子drawSpade被定義爲非靜態的,這意味着你需要卡的實例才能夠稱之爲:

private Card c = new Card(); 
c.drawSpade(<arguments>); 

如果你要稱呼其爲靜態方法聲明爲這樣有static關鍵字:

public static void drawSpade (Graphics pane, int xA, int yA) 
{ 
    ... 
} 

然後,您可以調用它是這樣:

Card.drawSpade(<arguments>); 

無論你需要一個還是另一個取決於你使用的方法。靜態方法不保持一張卡片的狀態,其中一個實例有一個,並且可以用來保持遊戲中每張卡片的狀態(通過爲遊戲中的每張卡片創建一個實例)。

0

對於這個例子,我們需要知道靜態方法和非靜態方法(又名實例方法)之間的區別。當我們創建一個靜態方法時,基本上是說這個方法現在屬於這個類,並且這個方法不需要訪問一個對象狀態。

所以我們可以只使用類名然後調用方法。

Card.drawSpade(pane, 75, 100); 

但是,由於drawSpade是和實例方法,這意味着我們需要創建該類的實例,以便能夠調用此方法。我們通過創建該類生成的對象來實現這一點。

Card myCard = new Card(); 
myCard.drawSpade(pane,75,100); 
相關問題