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

errors when drawing a rectangle that is read from an ArrayList?

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

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

这是主要的 class 文件,我 运行 里面的所有内容。

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);
            }

    }
}

最后但同样重要的是,这是我要读入的文件(该文件称为 MapData)

XOXX

当我 运行 class 地图时,我得到这个错误:

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.run(RepaintManager.java:835)
    at javax.swing.RepaintManager.run(RepaintManager.java:807)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain.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.access00(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.access0(EventQueue.java:97)
    at java.awt.EventQueue.run(EventQueue.java:697)
    at java.awt.EventQueue.run(EventQueue.java:691)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain.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

它可能不正确,但是您在调用 repaint() 之前是否调用过 readinmapdata()? 可能会导致这个问题