Java 绘制从ArrayList读取的矩形时出错?

Java 绘制从ArrayList读取的矩形时出错?,java,arraylist,graphics,jframe,jcomponent,Java,Arraylist,Graphics,Jframe,Jcomponent,我是这个网站的新手,所以如果我违反了任何规则,请原谅我。我已经找了几天了,还没有找到答案,请告诉我之前是否有人回答过 我正在创建一个java程序,它可以根据文件中的数据绘制图像(本例中为矩形)。我遇到了一个我无法修复或找到解决方案的错误 这是我运行一切的主类文件 package pkg9_weeks_project; import java.io.FileNotFoundException; import javax.swing.JFrame; public class Map { publi

我是这个网站的新手,所以如果我违反了任何规则,请原谅我。我已经找了几天了,还没有找到答案,请告诉我之前是否有人回答过

我正在创建一个java程序,它可以根据文件中的数据绘制图像(本例中为矩形)。我遇到了一个我无法修复或找到解决方案的错误

这是我运行一切的主类文件

package pkg9_weeks_project;
import java.io.FileNotFoundException;
import javax.swing.JFrame;

public class Map {
public static void main(String[] args) throws FileNotFoundException {
        JFrame window = new JFrame();
        window.setSize(640, 640);
        window.setTitle("this is a frame of J's, otherwise known as a JFrame");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);

        drawningcomponent DC = new drawningcomponent();
        window.add(DC);
        drawningcomponent.readinmapdata(); //this is to make sure it is reading the file in
    }
}
这是读入数据文件并将其数据添加到ArrayList中的文件 而且。。。好。。尝试使用ArrayList中的数据绘制矩形

package pkg9_weeks_project;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JOptionPane;

public class drawningcomponent extends JComponent
{
    public static ArrayList<String> maptiles2 ; 

    public static void readinmapdata() throws FileNotFoundException
    {
        maptiles2 = new ArrayList<String>();
        Scanner inputFile = new Scanner(new File("./src/MapData"));
        while(inputFile.hasNextLine())
        {
            String line = inputFile.nextLine();
            String data[] = line.split("");
            String tile1 = data[0].trim();
            String tile2 = data[1].trim();
            String tile3 = data[2].trim();
            String tile4 = data[3].trim();
            maptiles2.add(tile1);
            maptiles2.add(tile2);
            maptiles2.add(tile3);
            maptiles2.add(tile4);
(This was a test to make sure the items were added
and could be printed from the ArrayList)
            System.out.println(maptiles2.get(0));
            System.out.println(maptiles2.get(1));
            System.out.println(maptiles2.get(2));
            System.out.println(maptiles2.get(3));
        }
        System.out.println("SUCCESS READING IN FILE");
    }
(This is where the program is coming up with an error)
(I tested the graphics to make sure you could draw a )
(rectangle beforehand and it worked perfectly)
    public void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;
        Rectangle rect1 = new Rectangle(5,5,100,200);
            if(maptiles2.get(1).contains("X"))
            {
                g2.draw(rect1);
            }
            if(maptiles2.get(1).contains("O"))
            {
                g2.draw(rect1);
            }

    }
}
当我运行类映射时,出现以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
X
O
X
X
Success Reading in File
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at pkg9_weeks_project.drawningcomponent.paintComponent(drawningcomponent.java:60)
    at javax.swing.JComponent.paint(JComponent.java:1053)
    at javax.swing.JComponent.paintChildren(JComponent.java:886)
    at javax.swing.JComponent.paint(JComponent.java:1062)
    at javax.swing.JComponent.paintChildren(JComponent.java:886)
    at javax.swing.JComponent.paint(JComponent.java:1062)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
    at javax.swing.JComponent.paintChildren(JComponent.java:886)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5230)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:    1572)
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1495)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1265)
    at javax.swing.JComponent.paint(JComponent.java:1039)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:79)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:116)
    at java.awt.Container.paint(Container.java:1973)
    at java.awt.Window.paint(Window.java:3901)
    at javax.swing.RepaintManager$4.run(RepaintManager.java:835)
    at javax.swing.RepaintManager$4.run(RepaintManager.java:807)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:7    5)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
    at javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
    at java.awt.EventQueue.access$400(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:697)
    at java.awt.EventQueue$3.run(EventQueue.java:691)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:7    5)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201    )
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105    )
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
我可能错了,但当它说: java.lang.IndexOutOfBoundsException:索引:1,大小:0 这意味着arraylist maptiles2中不再有任何项,但我现在不知道,并且非常困惑。对于所有回复者,感谢您的回复,非常感谢

编辑:感谢大家的回答,答案是一个简单的错误,涉及到在运行其他所有操作之后运行readinmapdata方法。非常感谢。 @amit farag和@svarog为您提供了有用的答案

java.lang.IndexOutOfBoundsException: Index: 1, Size: 0

表示您正试图访问列表中没有元素的第一个元素,请使用add()方法将值添加到ArrayList

它可能不正确,但在调用
重新绘制()之前,您是否调用了
readinmapdata()
package pkg9_weeks_project;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JOptionPane;

public class drawningcomponent extends JComponent
{
    public static ArrayList<String> maptiles2 ; 

    public static void readinmapdata() throws FileNotFoundException
    {
        maptiles2 = new ArrayList<String>();
        Scanner inputFile = new Scanner(new File("./src/MapData"));
        while(inputFile.hasNextLine())
        {
            String line = inputFile.nextLine();
            String data[] = line.split("");
            String tile1 = data[0].trim();
            String tile2 = data[1].trim();
            String tile3 = data[2].trim();
            String tile4 = data[3].trim();
            maptiles2.add(tile1);
            maptiles2.add(tile2);
            maptiles2.add(tile3);
            maptiles2.add(tile4);
(This was a test to make sure the items were added
and could be printed from the ArrayList)
            System.out.println(maptiles2.get(0));
            System.out.println(maptiles2.get(1));
            System.out.println(maptiles2.get(2));
            System.out.println(maptiles2.get(3));
        }
        System.out.println("SUCCESS READING IN FILE");
    }
(This is where the program is coming up with an error)
(I tested the graphics to make sure you could draw a )
(rectangle beforehand and it worked perfectly)
    public void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;
        Rectangle rect1 = new Rectangle(5,5,100,200);
            if(maptiles2.get(1).contains("X"))
            {
                g2.draw(rect1);
            }
            if(maptiles2.get(1).contains("O"))
            {
                g2.draw(rect1);
            }

    }
}

这可能会导致这个问题

我在计算机科学的第一年即将结束,因此我可能无法完全理解您所解释的内容。因此,如果这不是太多的要求,请在你的答案上深入一点。谢谢rangeCheck(ArrayList.java:653),您会得到一个IndexArrayOutOfBounds异常,因为您试图访问内存中尚未初始化的段。正如我说的,我是初学者,当您说:“尚未初始化”时,您的意思是我需要初始化ArrayList,对吗?错误发生在第60行。如果你告诉我们那是哪一行会有帮助的对不起!我的意思是在DrawningComponent中添加这段代码:如果(maptiles2.get(1).contains(“X”))我在readinmapdata方法中添加了我想要的元素,而且它没有添加其他方法使用的元素,我如何添加数据以便其他方法使用?我不知道,因为我说我是一个稍微初学者。statis不需要还是不应该在这里?删除static关键字并确保该方法在“paintComponent”方法之前运行,如果它不起作用,请测试它我将一些值移动到该方法谢谢您,@amit farag解决了我的错误。这是由上次运行readinmapdata方法的一个简单错误引起的。谢谢!这解决了我的错误,哦,我的天,这是一个简单的错误!非常感谢您的帮助。没问题;)你将看到在未来,这将发生很多,要小心,并始终注意