2015-04-22 48 views
0

我試圖打印一個矩形數組,並在運行時獲取錯誤。Java畫圖類不顯示矩形陣列

我從我的主類中發送一個數字,只是一個普通的int(如5)到我的paint class中的getdatafordisplay(the number I send)函數。這會在if語句中進行一些檢查,以便我們知道在哪裏顯示矩形。到目前爲止,這在我的程序中運行良好。

現在它將它保存在矩形類中,然後這應該在運行時顯示所有矩形?

另外值得一提的,我從這個網站,用戶張貼在此爲主動的學習方法:https://tips4java.wordpress.com/2009/05/08/custom-painting-approaches/

我的油漆類:

class mainPanel extends JPanel 
{ 
    int processes, storedProcesses; 

    //for inital values of rectangles 
    int xCoor = 0; 
    int yCoor = 0; 
    int width = 10; 
    int height = 50; 

    static int x = 100; 
    int [] y = {100,150,200,250,300,350,400,450,500,550}; 

    private ArrayList<ColoredRectangle> coloredRectangles = new ArrayList<ColoredRectangle>(); 

    class ColoredRectangle 
    { 
      private Rectangle rectangle; 

      public ColoredRectangle() 
      { 
       System.out.println("REC"); 
      } 

     public Rectangle getRectangle() 
     { 
       return rectangle; 
     } 
    } 

    public void addRectangle(ColoredRectangle rectangle) 
    { 
      coloredRectangles.add(rectangle); 
      repaint(); 
    } 

    public mainPanel(int processFROMmain) 
    { 
     //just some jpanel looks here 
    } 

    public Dimension getPreferredSize() { 
     return new Dimension (1000, 1000); 
    } 

    public void getDataForDisplay (int proc) 
    { 
    //the method checks the value from "proc" to see where to display a rectangle on screen. proc comes from user i.e 5 
    int loop = 0; 

    while (loop < storedProcesses) 
    { 
     int breakloop = 0; 

     if (proc == loop) 
     { 
      xCoor = x; 
      yCoor = y[loop]; 
      x = x + 10; 
      breakloop = 1; 
      Rectangle r = new Rectangle(xCoor, yCoor, width, height); 
      ColoredRectangle cr = new ColoredRectangle(); 
      addRectangle(cr); 
     } 

     if (breakloop == 1) 
     { 
      break; 
     } 

     loop++; 
    } 
} 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

    for (mainPanel.ColoredRectangle cr : coloredRectangles) 
     { 
     g.setColor(Color.RED); 
     Rectangle r = cr.getRectangle(); 
     g.drawRect(r.x, r.y, r.width, r.height); 
     } 
    } 
} 

我得到的錯誤:

線程「AWT-EventQueue-0」中的異常java.lang.NullPointerException
at mainPanel.paintComponent(main.java:275)
在javax.swing.JComponent.paint(JComponent.java:1045)
在javax.swing.JComponent.paintChildren(JComponent.java:878) 在javax.swing.JComponent.paint(JComponent.java:1054) 在javax.swing.JComponent.paintChildren(JComponent.java:878) 在javax.swing.JComponent.paint(JComponent.java:1054) 在javax.swing.JLayeredPane.paint(JLayeredPane.java:585) 在javax.swing.JComponent.paintChildren(JComponent.java:878) at javax.swing.JComponent.paintToOffscreen(JComponent.java:5217) at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:295) at javax。 swing.RepaintManager.paint(RepaintManager.java:1249)(SunGraphicsCallback.java:78)在Sun.awt.SunGraphicsCallback.runOneComponent(SunCharticsCallback.java:78)上的$ PaintCallback.run(GraphicsCallback.java:39) 太陽.awt。圖形回調。運行組件javax.swing.RepaintManager $ 3.run(RepaintManager.java:819) at javax.swing.RepaintManager $ 3.run(RepaintManager.java:796) at java.security.AccessController.doPrivileged(Native Method) at java.security .ProtectionDomain $ 1.doIntersectionPrivilege(ProtectionDomain.java:76) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:796) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:769) at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:718) at javax.swing.RepaintManager.access $ 1100(RepaintManager.java:62) at javax.swing.RepaintManager $ ProcessingRunnable.run(RepaintManager.java:1677) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251 ) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733) at java.awt.EventQueue.access $ 200(EventQueue.java:103) at java.awt.EventQueue $ 3.run(EventQueue.java:694) ) at java.awt.EventQueue $ 3.run(EventQueue.java:692) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain $ 1.doIntersectionPrivilege(ProtectionDomain。的java:76) 在java.awt.EventQueue.dispatchEvent(EventQueue.java:703) 在java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 在java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java: 161) 在java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 在java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 在java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 在java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

回答

4

你從來沒有真正存儲Rectangle對象在您的ColoredRectangle對象中。你正在初始化一個變量,private Rectangle rectangle;但就是這樣。你應該編輯你的代碼。

private Rectangle rectangle; 

    public ColoredRectangle(Rectangle rectangle) { 
     this.rectangle = rectangle; 
     System.out.println("REC"); 
} 

而在getDataForDisplay方法;

Rectangle r = new Rectangle(xCoor, yCoor, width, height); 
ColoredRectangle cr = new ColoredRectangle(r); 
1

你忘了與ColoredRectange連接Rectangle,對於該NPE,當您嘗試訪問矩形的屬性之一。

的(快速&髒)的解決將是:

Rectangle r = new Rectangle(xCoor, yCoor, width, height); 
ColoredRectangle cr = new ColoredRectangle(); 
cr.rectangle = r; //<-- adding this line 
addRectangle(cr); 
+0

肯定,歡迎!我也更喜歡Jyr的回答:-) – xerx593