Java绘制类不显示矩形数组

标签 java swing

我正在尝试打印矩形数组,但在运行时出现错误。

我从我的主类发送一个数字,只是一个普通的 int,例如 5 到我的绘制类中的 getdatafordisplay(我发送的数字) 函数。这会在 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);
        }
    }  
}

我得到的错误是:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at mainPanel.paintComponent(main.java:275)
at javax.swing.JComponent.paint(JComponent.java:1045)
at javax.swing.JComponent.paintChildren(JComponent.java:878) at javax.swing.JComponent.paint(JComponent.java:1054) at javax.swing.JComponent.paintChildren(JComponent.java:878) at javax.swing.JComponent.paint(JComponent.java:1054) at javax.swing.JLayeredPane.paint(JLayeredPane.java:585) at 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) 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) at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115) at java.awt.Container.paint(Container.java:1967) at java.awt.Window.paint(Window.java:3877) at 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) at java.awt.EventQueue.dispatchEvent(EventQueue.java:703) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

最佳答案

您实际上从未在 ColoredRectangle 对象中存储 Rectangle 对象。您正在初始化一个变量,private 矩形矩形; 但仅此而已。您应该编辑您的代码。

private Rectangle rectangle;

    public ColoredRectangle(Rectangle rectangle) {
        this.rectangle = rectangle;
}

并在getDataForDisplay方法中;

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

关于Java绘制类不显示矩形数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29810738/

相关文章:

java - 在推土机中使用中间集合映射深层属性

java - 如何将 JToolBar 放置在我的 JFrame 底部(如 MS 可视组件)?

java - 读取文件并将字符串和数值以特定格式存储在数组中

java - Spring MVC - 动态错误处理页面

c# - winforms 面板与 java swing 面板

Java Midi Sequencer - 使用播放头进行音符播放

java - 设计 JFrame 并安装多个 JPanel?

java - 如何有效地将入站 netty.io ByteBuf 消息分发到 ChannelGroup?

用于构建 GUI 面板的 Java 函数

Java 文本字段焦点