【问题标题】:JTextField and getActionCommand to store in a user expanding arrayJTextField 和 getActionCommand 存储在用户扩展数组中
【发布时间】:2015-04-07 14:54:16
【问题描述】:

我使用这个 GUI 程序的主要目的是让用户在名字框中输入学生的名字,在姓氏框中输入相应的姓氏,然后点击保存。然后点击保存会将名字和姓氏保存到各自的数组中。用户完成输入名称后,他们将单击排序。这将按字母顺序对名称进行排序,然后重新绘制 GUI 以显示新排序的名称数组的结果。我遇到的主要问题是,当我输入一个名称时,我会得到一个错误清单(见下文)。我也不知道如何重绘 GUI 以在列表中显示名称数组。任何帮助将不胜感激,谢谢!

这是我当前的代码。 (变量名很长,但我讨厌创建变量名然后忘记它们的用途。) 导入 java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import javax.swing.*;

public class main extends JFrame {

    JTextField studentNameInputFirst, studentNameInputLast, studentNamesEnetered;
    JButton nextName, sort;
    JLabel firstName, lastName;
    String disp = "";
    int totalNumberOfStudents = 0;
    String[] studentFirstNames = new String[totalNumberOfStudents];
    String[] studentLastNames = new String[totalNumberOfStudents];

    public main() {
        Container container = getContentPane();
        container.setLayout(new FlowLayout());

        studentNamesEnetered = new JTextField();
        studentNameInputFirst = new JTextField(15);
        studentNameInputLast = new JTextField(15);
        nextName = new JButton("Save");
        sort = new JButton("Sort");
        firstName = new JLabel("First Name: ");
        lastName = new JLabel("Last Name: ");

        container.add(firstName);
        container.add(studentNameInputFirst);
        container.add(lastName);
        container.add(studentNameInputLast);
        container.add(nextName);
        container.add(sort);

        nextName.addActionListener(new nextNameListener());
        sort.addActionListener(new sortListener());

        setSize(325, 120);
        setVisible(true);
    }

    private class nextNameListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            totalNumberOfStudents++;
            studentFirstNames[totalNumberOfStudents] = studentNameInputFirst.getText();
            studentLastNames[totalNumberOfStudents] = studentNameInputLast.getText();
            studentNameInputLast = null;
            studentNameInputFirst = null;
        }
    }
    private class sortListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
        }
    }

    public static void main(String[] args) {
        main drawGui = new main();
        drawGui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

这是我在运行上述代码时遇到的错误:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1
    at main$nextNameListener.actionPerformed(main.java:48)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

编辑:使用提供的建议使用 ArrayList 而不是普通数组的答案后,我不再出现错误。我还对程序的命名进行了更改,以遵循 Java 命名约定,并且为了我自己了解程序的功能而保持清醒。对第 13、14、45 和 46 行进行了更改。感谢您的帮助!

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;

public class ClassNameSorting extends JFrame {

    JTextField studentNameInputFirst, studentNameInputLast, studentNamesEnetered;
    JButton nextName, sort;
    JLabel firstName, lastName;
    String disp = "";
    ArrayList<String> studentNameFirst = new ArrayList<String>();
    ArrayList<String> studentNameLast = new ArrayList<String>();


    public ClassNameSorting() {
        Container container = getContentPane();
        container.setLayout(new FlowLayout());

        studentNamesEnetered = new JTextField();
        studentNameInputFirst = new JTextField(15);
        studentNameInputLast = new JTextField(15);
        nextName = new JButton("Save");
        sort = new JButton("Sort");
        firstName = new JLabel("First Name: ");
        lastName = new JLabel("Last Name: ");

        container.add(firstName);
        container.add(studentNameInputFirst);
        container.add(lastName);
        container.add(studentNameInputLast);
        container.add(nextName);
        container.add(sort);

        nextName.addActionListener(new nextNameListener());
        sort.addActionListener(new sortListener());

        setSize(325, 120);
        setVisible(true);
    }

    private class nextNameListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            studentNameFirst.add(studentNameInputFirst.getText());
            studentNameLast.add(studentNameInputLast.getText());
            studentNameInputLast = null;
            studentNameInputFirst = null;
        }
    }
    private class sortListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
        }
    }

    public static void main(String[] args) {
        ClassNameSorting drawGui = new ClassNameSorting();
        drawGui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

【问题讨论】:

  • 你已经得到了这个问题的一个不错的答案,但是以后请告诉我们哪一行会导致你所询问的任何异常。例如,在这里您的堆栈跟踪告诉您异常正在被抛出:48 -- ((main.java:48))。此外,您需要确保您的代码符合 Java 命名标准,这意味着类名应以大写字母开头。这有助于其他人(我们!)更快地理解您的代码。
  • 好的,非常感谢! Java 对我来说有点陌生(即使我之前没有 Java 知识,我最终还是被安排在大学的高级 Java 课程中)我现在会记住命名约定!我也做出了答案中建议的更改,并且不再出现错误。

标签: java arrays swing user-interface indexoutofboundsexception


【解决方案1】:
int totalNumberOfStudents = 0;
String[] studentFirstNames = new String[totalNumberOfStudents];
String[] studentLastNames = new String[totalNumberOfStudents];

您的数组大小为 0。您需要为数组分配您希望添加到数组中的条目数。

不要使用数组,因为你不知道大小应该是多少。而是使用ArrayList

【讨论】:

  • 谢谢我已更改为 ArrayList。我已将我编辑的代码添加到我的编辑下的帖子中。再次感谢!
猜你喜欢
  • 2012-08-07
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多