Java:IndexOutOfBounds 异常和 eventDispatch

Java: IndexOutOfBounds exception and eventDispatch

如果标题没有描述我遇到的问题,我深表歉意。 我正在为一个简单的 GUI 计算器开发一个测试 GUI。测试 GUI 将允许用户单击计算器 GUI 的组件以记录它们。然后开始在这些组件中输入值以测试计算器的功能。

本质上,我设置了三个类MyListener、ThreadRunner和TestGUI。 TestGUI 有两个按钮,一个按钮使用户可以单击计算器 JTextfields 并使用 ThreadRunner 中的方法记录它们,ThreadRunner 有一个 ArrayList 来存储 JTextFields 和其他变量来存储其他组件。另一个按钮是通过 TestRunner 中的方法将值设置到存储在 ArrayList 中的 JTextFields 中。我遇到的问题是,当我单击第二个按钮设置新值时,我得到了异常 IndexOutOfBounds 以及其他异常。在过去的几天里,我一直在用头撞墙试图解决这个问题,所以非常感谢任何帮助。谢谢!

public class ThreadRunner extends Thread {
//ChooseInput ci = new ChooseInput();
//List<String> inputVal = ci.getInput();

List<JTextField> listOfTextFields = new ArrayList<>();
JTextField output;
JButton goButton;

public void getInputField(JTextField a) {
    listOfTextFields.add(a);
    System.out.println("getinput func. in thread runner works");
    //System.out.println(a);
    System.out.print(listOfTextFields.get(0));
}

public void getOutputField(JTextField a) {
    output = a;
}

public void getButton(JButton a) {
    goButton = a;
}

public void go() {
    for (int i = 0; i < 2; i++) { // to test if go() can access listOfTextFields
        System.out.print(listOfTextFields.get(i));
    }
    listOfTextFields.get(0).setText("10");
    listOfTextFields.get(1).setText("20");
    System.out.println("func go() works");
}
}


public class MyListener implements AWTEventListener {
ThreadRunner t = new ThreadRunner();
public MyListener(ThreadRunner t) {
    t = t;
}

@Override
public void eventDispatched(AWTEvent event) {

    if (event.paramString().substring(0, 13).equals("MOUSE_CLICKED")) {
        System.out.println("Click happens");
        Object o = event.getSource();
        if (o.getClass().equals(JTextField.class)) {
            JTextField tf = (JTextField) o;
            if (tf.isEditable()) {
                t.getInputField(tf);
                System.out.println("TR shpuld have a field");
            } else {
                t.getOutputField(tf);
            }
        }

        if (o.getClass().equals(JButton.class)) {
            JButton jb = (JButton) o;
            t.getButton(jb);
        }
    }
}
}

public class TestGUI {

public TestGUI() {
    final ThreadRunner tr = new ThreadRunner();
    final MyListener ml = new MyListener(tr);
    JFrame f1 = new JFrame();
    JButton b1 = new JButton("get locations");
    JButton b2 = new JButton("test");
    f1.setVisible(true);
    f1.setSize(500, 200);

    f1.getContentPane().add(b1, BorderLayout.NORTH);
    f1.getContentPane().add(b2, BorderLayout.SOUTH);

    b1.setVisible(true);
    b2.setVisible(true);

    b1.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent ae) {
            MyGUI gui = new MyGUI();
            gui.setSize(500, 300);
            gui.setVisible(true);
            gui.setLocation(200, 200);

            Toolkit tk = Toolkit.getDefaultToolkit();

            tk.addAWTEventListener(ml, AWTEvent.MOUSE_EVENT_MASK);
        }
    }
    );

    b2.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent ae) {
            tr.go();
        }
    }
    );
}
}

调用ThreadRunner中的go()方法时报错 堆栈跟踪:

run:

发生点击 点击发生 获取输入函数在螺纹亚军作品中 javax.swing.JTextField[103,12,249x41,layout=javax.swing.plaf.basic.BasicTextUI$UpdateHandler,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@b97bc3,flags=296,maximumSize=,minimumSize =,preferredSize=,caretColor=sun.swing.PrintColorUIResource[r=51,g=51,b=51],disabledTextColor=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],editable=true ,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],selectedTextColor=sun.swing.PrintColorUIResource[r=51,g=51,b=51],selectionColor=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],columns=0,columnWidth=0,command=,horizo​​ntalAlignment=LEADING]TR 应该有一个字段 点击发生 获取输入函数在螺纹亚军作品中 javax.swing.JTextField[103,12,249x41,layout=javax.swing.plaf.basic.BasicTextUI$UpdateHandler,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.BorderUIResource$CompoundBorderUIResource@b97bc3,flags=296,maximumSize=,minimumSize =,preferredSize=,caretColor=sun.swing.PrintColorUIResource[r=51,g=51,b=51],disabledTextColor=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],editable=true ,margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],selectedTextColor=sun.swing.PrintColorUIResource[r=51,g=51,b=51],selectionColor=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],columns=0,columnWidth=0,command=,horizo​​ntalAlignment=LEADING]TR 应该有一个字段 线程 "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException 中的异常:索引:0,大小:0 点击发生 在 java.util.ArrayList.rangeCheck(ArrayList.java:653) 在 java.util.ArrayList.get(ArrayList.java:429) 在 ThreadRunner.go(ThreadRunner.java:43) 在 TestGUI$2.actionPerformed(TestGUI.java:55) 在 javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 在 javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346) 在 javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 在 javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 在 java.awt.Component.processMouseEvent(Component.java:6525) 在 javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 在 java.awt.Component.processEvent(Component.java:6290) 在 java.awt.Container.processEvent(Container.java:2234) 在 java.awt.Component.dispatchEventImpl(Component.java:4881) 在 java.awt.Container.dispatchEventImpl(Container.java:2292) 在 java.awt.Component.dispatchEvent(Component.java:4703) 在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898) 在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533) 在 java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462) 在 java.awt.Container.dispatchEventImpl(Container.java:2278) 在 java.awt.Window.dispatchEventImpl(Window.java:2750) 在 java.awt.Component.dispatchEvent(Component.java:4703) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751) 在 java.awt.EventQueue.access500 美元(EventQueue.java:97) 在 java.awt.EventQueue$3.run(EventQueue.java:702) 在 java.awt.EventQueue$3.run(EventQueue.java:696) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86) 在 java.awt.EventQueue$4.run(EventQueue.java:724) 在 java.awt.EventQueue$4.run(EventQueue.java:722) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:721) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

这里的问题是你使用了

ThreadRunner t = new ThreadRunner();
public MyListener(ThreadRunner t) {
    t = t;
}

这基本上是将参数分配给自己,而不是您在上面定义的局部变量。通过使用 this,您明确指定您希望引用实例变量 t 而不是参数。 所以要么使用

ThreadRunner t = new ThreadRunner();
public MyListener(ThreadRunner t) {
    this.t = t;
}

或者将您的 class 变量重命名为另一个名称,例如

ThreadRunner ct = new ThreadRunner();
public MyListener(ThreadRunner t) {
    ct = t;
}