2015-04-22 10 views
0

Я пытаюсь напечатать массив прямоугольников и получить ошибки во время выполнения.Класс краски Java, не отображающий массив прямоугольников

Я посылаю номер из моего основного класса только обычный int, такой как 5, в мою функцию 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); 
     } 
    } 
} 

Ошибки я получаю:

Исключение в нити "АВТ-EventQueue-0" java.lang.NullPointerException
в 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) на javax.swing.JComponent.paintToOffscreen (JComponent.java:5217) на javax.swing.BufferStrategyPaintManager.paint (BufferStrategyPaintManager.java:295) на javax. swing.RepaintManager.paint (RepaintManager.java:1249) at javax.swing.JComponent.paint (JComponent.java:1031) at java.awt.GraphicsCallback $ PaintCallback.run (GraphicsCallback.java:39) at sun.awt.SunGraphicsCallback.runOneComponent (SunGraphicsCallback.java:78) на sun.awt.SunGraphicsCallback.runComponents (SunGraphicsCallback.java:115) в java.awt.Container.paint (Container.java:1967) в java.awt.Window.paint (Window.java:3877) на javax.swing.RepaintManager $ 3.run (RepaintManager.java:819) at javax.swing.RepaintManager $ 3.run (RepaintManager.java:796) at java.security.AccessController.doPrivileged (собственный метод) at java.security .ProtectionDomain $ 1.doIntersectionPrivilege (ProtectionDomain.java:76) в javax.swing.RepaintManager.paintDirtyRegions (RepaintManager.java:796) в javax.swing.RepaintManager.paintDirtyRegions (RepaintManager.java:769) в javax.swing.RepaintManager.prePaintDirtyRegions (RepaintManager.java:718) на javax.swing.RepaintManager.access $ 1100 (RepaintManager.java:62) в javax.swing.RepaintManager $ ProcessingRunnable.run (RepaintManager.java:1677) в 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 (собственный метод) 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

Вы забыли подключить Rectangle с ColoredRectange, для этого в NPE, когда вы пытаетесь получить доступ к одному из атрибутов прямоугольника.

The (быстрый & грязный) исправить будет:

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

уверен, добро пожаловать! Я также предпочитаю ответ Джыра :-) – xerx593