2014-03-27 17 views
0

這是模具類,它應該根據用戶規格繪製一個模具,如主要所示。我的編程項目將不起作用

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JPanel; 

public class Die extends JPanel 
{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    int xCoordinate; 
    int yCoordinate; 
    int num; 


    Graphics pen, g; 

    private static final int DIE_LENGTH = 60;  //Set's the size 
    private static final int DIE_WIDTH = 60;  //of the die 
    private static final int DIE_HEIGHT = 60; 
    private static final int DOT_LENGTH = 10; 
    private static final int DOT_WIDTH = 10; 
    private static final Color LINE_COLOR = Color.black; 
    private static final Color DIE_COLOR = Color.white; 
    private static final Color DOT_COLOR = Color.black; 
    private static final int DIE_VERT = 10; 
    private static final int DIE_HORI = 10; 


    public Die(int dieNum, int x, int y) 
    { 
     xCoordinate = x; 
     yCoordinate = y; 

     num = dieNum; 
    } 

    @Override protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     //Creates the square 
     g.drawRect(getX(), getY(), DIE_WIDTH, DIE_HEIGHT); 
     g.setColor(LINE_COLOR); 
     g.fillRect(xCoordinate, yCoordinate, DIE_LENGTH, DIE_WIDTH); 
     if (num <= 0) 
      drawBlank(); 
     else if (num == 1) 
      drawOne(); 
     else if (num == 2) 
      drawTwo(); 
     else if (num == 3) 
      drawThree(); 
     else if (num == 4) 
      drawFour(); 
     else if (num == 5) 
      drawFive(); 
     else if (num == 6) 
      drawSix(); 



    } 

    private void drawBlank() 
    { 
     pen.fillRect(xCoordinate, yCoordinate, DIE_LENGTH, DIE_WIDTH); 
     pen.setColor(DIE_COLOR); 
    } 

    private void drawDot (int x, int y) 
    { 
     super.paintComponent(g); 
     g.setColor(DOT_COLOR); 
     g.fillOval(x, y, DOT_LENGTH, DOT_WIDTH); 

    } 
    private void drawOne() 
    { 
     super.paintComponent(g); 
     drawBlank(); 
     drawDot(xCoordinate, yCoordinate); 

    } 
    private void drawTwo() 
    { 
     super.paintComponent(g); 
     drawBlank(); 
     pen.fillOval((xCoordinate - DIE_HORI), (yCoordinate + DIE_VERT), DOT_LENGTH, DOT_WIDTH); 
     pen.fillOval((xCoordinate + DIE_HORI), (yCoordinate - DIE_VERT), DOT_LENGTH, DOT_WIDTH); 

    } 
    private void drawThree() 
    { 

     drawBlank(); 
     drawOne(); 
     drawTwo(); 

    } 

    private void drawFour() 
    { 
     super.paintComponent(g); 
     drawBlank(); 
     drawDot((xCoordinate - DIE_HORI),(yCoordinate + DIE_VERT)); 
     drawDot((xCoordinate + DIE_HORI),(yCoordinate + DIE_VERT)); 
     drawDot((xCoordinate - DIE_HORI),(yCoordinate - DIE_VERT)); 
     drawDot((xCoordinate + DIE_HORI),(yCoordinate - DIE_VERT)); 

    } 

    private void drawFive() 
    { 
     drawBlank(); 
     drawFour(); 
     drawOne(); 


    } 


    private void drawSix() 
    { 
     drawBlank(); 
     drawFour(); 
     drawDot((xCoordinate - DIE_HORI), yCoordinate); 
     drawDot((xCoordinate + DIE_HORI) , yCoordinate); 

    } 

} 

這是主要的。

import javax.swing.JFrame; 
import java.awt.Color; 
import java.util.Scanner; 

public class RollTheDie 
{ 

    public static void main(String[] args) 
    { 

     final int WINDOW_HEIGHT = 350; 
     final int WINDOW_WIDTH = 300; 

     System.out.println("Hi! Let's play dice!\n"); 

     Scanner kb = new Scanner(System.in); 

     System.out.print("Enter the number on the face of the die:"); 
     int num = kb.nextInt(); 

     System.out.print("Enter the location of the die:"); 
     int x = kb.nextInt(); 
     int y = kb.nextInt(); 

     System.out.println("I hope you had fun! Bye!"); 

     JFrame dieWindow = new JFrame(); 
     dieWindow.setBackground(Color.gray); 
     dieWindow.setSize(WINDOW_HEIGHT, WINDOW_WIDTH); 
     dieWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     dieWindow.setTitle("Roll the Die"); 

     Die newDie = new Die(num,x,y); 
     dieWindow.add(newDie); 
     dieWindow.setVisible(true); 

     kb.close(); 
    } 
} 

當我運行代碼,我得到我似乎無法修復這個空異常錯誤,任何提示?這些錯誤指向的第一行我繪畫方法這取決於用戶輸入(數點擊模具上),窗口打開但沒有畫出任何東西,背景是白色的。當我運行代碼時,以下是我的控制檯中顯示的內容:

嗨!讓我們玩骰子!

對模具的面輸入號碼:5

輸入模具的位置:50

我希望你有樂趣!再見!

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at Die.drawBlank(Die.java:67)--(This Points to the drawBlank() method first line.) 
    at Die.drawFive(Die.java:115)--(This points to the drawBlank() in the method drawFive().) 
    at Die.paintComponent(Die.java:57)--(This points to my paintComponent(Graphics g) method, the line that has drawFive().) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at javax.swing.JLayeredPane.paint(Unknown Source) 
    at javax.swing.JComponent.paintChildren(Unknown Source) 
    at javax.swing.JComponent.paintToOffscreen(Unknown Source) 
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source) 
    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source) 
    at javax.swing.RepaintManager.paint(Unknown Source) 
    at javax.swing.JComponent.paint(Unknown Source) 
    at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source) 
    at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source) 
    at sun.awt.SunGraphicsCallback.runComponents(Unknown Source) 
    at java.awt.Container.paint(Unknown Source) 
    at java.awt.Window.paint(Unknown Source) 
    at javax.swing.RepaintManager$3.run(Unknown Source) 
    at javax.swing.RepaintManager$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source) 
    at javax.swing.RepaintManager.access$1100(Unknown Source) 
    at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$200(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
+0

您能否將標題改爲更好地描述問題的內容,以便將來搜索用戶的好處? –

回答

2

您聲明變量pen,但從不初始化它。

你在你的代碼:

Graphics pen, g; 
// ... 
private void drawBlank() 
{ 
    pen.fillRect(xCoordinate, yCoordinate, DIE_LENGTH, DIE_WIDTH); 
    pen.setColor(DIE_COLOR); 
} 

但無處是pen實際上初始化或設置爲一個實例。當執行pen.fillRect()時,將引發NullPointerException。

有關NullPointerException意味着什麼的更多信息,請參閱@Sotirios_Delimanolis對您的問題的評論。

0

我可能只是失明,但你曾經分配給g或筆嗎?

Graphics g, pen; 

編輯:你必須實際上分配一個圖形對象g和筆之前調用他們的方法。