【问题标题】:Load JTable data from txt从 txt 加载 JTable 数据
【发布时间】:2017-11-20 12:00:43
【问题描述】:

我的代码太大,无法在此处附加。我将只为您提供问题的部分。

frame2.addWindowListener(new WindowAdapter() {
        @Override
        public void windowOpened(WindowEvent e) {
            File table_f = new File("C:\\Database\\Table\\Table.txt");
            String table_f_path = table_f.getPath();
            try {
            BufferedReader b_reader = new BufferedReader(new FileReader(new File(table_f_path)));
            BufferedReader reader = new BufferedReader(new FileReader(table_f_path));
            int lines = 0;
            while (reader.readLine() != null) lines++;
            reader.close();
            String table_apo_out;
            for (int y = 1;y < lines;y++){
                table_apo_out = b_reader.readLine();
                String[] table_apo_out_array = table_apo_out.split("~");
                for (int z=0;z < 20;z++) {
                    System.out.println(Arrays.toString(table_apo_out_array));
                    System.out.println(y);
                    System.out.println(lines);
                    model_table.setValueAt(table_apo_out_array[z],y,z);
                }
            }
            } catch (IOException qq) {
                qq.printStackTrace();
            }
        }
    });

这部分尝试从 txt 文件中加载保存的数据。我还将给您将这些信息保存在 txt 文件中的部分:

frame2.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent e) {
            File table_f = new File("C:\\Database\\Table\\Table.txt");
            int num_row = table.getRowCount();
            int num_columns = 21;
            for (int n = 0;n < num_row; n++){
                for(int m = 0;m < num_columns; m++){

                    FileWriter f_writer = null;
                    BufferedWriter b_writer = null;
                    String table_f_path = table_f.getPath();
                    try {
                        f_writer = new FileWriter(table_f_path, true);
                        b_writer = new BufferedWriter(f_writer);
                        if (m == 20) {
                            Object com = model_table.getValueAt(n, m);
                            String com_str = com.toString();
                            b_writer.write(com_str+"\r\n");
                        } else if (m == 0){
                            continue;
                        } else {
                            Object data = model_table.getValueAt(n, m);
                            String data_str = data.toString();
                            b_writer.write(data_str+"~");
                        }
                    } catch (IOException | NullPointerException | ArrayIndexOutOfBoundsException io){
                        io.printStackTrace();
                    } finally {
                        try {
                            if (b_writer != null)
                                b_writer.close();
                            if (f_writer != null)
                                f_writer.close();
                            if(n == num_row){
                                frame2.dispose();
                            }
                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }
                    }
                    }
                }
        }
    });

我们从 JTable 得到的数据是这样的:

300/50~Δευτέρα 12 Μαΐου 2014~gak~gak~gak~gak~gak~gak~gak~gak~gak~gak~gak~Παρασκευή 5 Μαΐου 2017~524.0~2452.0~gak~2452.0~gak~245245
300/50~Δευτέρα 12 Μαΐου 2014~gak~gak~gak~gak~gak~gak~gak~gak~gak~gak~gak~Παρασκευή 5 Μαΐου 2017~524.0~2452.0~gak~2452.0~gak~---

数据已保存。现在我在尝试加载它们时遇到了问题!这是我得到的异常:

Exception in thread "AWT-EventQueue-0"
java.lang.ArrayIndexOutOfBoundsException: 1 >= 0
at java.util.Vector.elementAt(Vector.java:474)
at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:664)
at Test$21.windowOpened(Test.java:2545)
at java.awt.AWTEventMulticaster.windowOpened(AWTEventMulticaster.java:340)
at java.awt.Window.processWindowEvent(Window.java:2051)
at javax.swing.JFrame.processWindowEvent(JFrame.java:305)
at java.awt.Window.processEvent(Window.java:2013)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
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)

部分代码是希腊语,抱歉

【问题讨论】:

  • at Test$21.windowOpened(Test.java:2545) -- 2545?是时候重构了
  • 您会在问答中找到与您的问题重复的完整示例;如果这不是重复的,请编辑您的问题以包含 minimal reproducible example,以显示您修改后的方法。
  • 这个问题最初是作为一个副本关闭的:stackoverflow.com/questions/5554734/…。虽然该问题试图解决“一般”ArrayIndexOutOfBoundsException: 的原因,但基于花一些时间实际查看代码,OP 不了解使用 DefaultTableModel 的基础知识,因此需要更多信息来解决问题。所以我重新提出了这个问题。
  • 阅读@camickr 的有用答案后,请参阅相关示例here,显示addRow(),和here,显示同源addFile()

标签: java swing jtable indexoutofboundsexception


【解决方案1】:

首先,论坛的重点不是让您转储堆栈跟踪,就好像您不知道异常试图告诉您什么(这就是这个问题最初被关闭的原因)。

您要做的第一件事是在论坛中搜索与ArrayIndexOutOfBoundsException 有错误的其他问题。使用论坛中的信息来解决(缩小)您的问题。

java.lang.ArrayIndexOutOfBoundsException: 1 >= 0

上面告诉你,你的索引值太大了。

at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:664)

以上提供了更多信息,告诉您使用setValueAt(..) 方法时会出现问题。所以其中一个指标是错误的。确定哪个索引错误是您的工作。

在我看来,问题可能与不了解 DefaultTableModel 内部的工作原理有关。也就是说,当您使用setValueAt(...) 方法时,DefaultTableModel 不会自动为您创建存储。如果模型已经分配了数据的存储空间,则只能使用该方法。

您没有向我们展示您创建 DefaultTableModel 的位置。所以唯一的假设是你做错了。

解决问题的最简单方法是:

  1. 创建一个仅包含列名和 0 行的 DefaultTableModel。阅读 DefaultTableModel API 以了解要使用的正确构造函数。

  2. 然后,当您从文件中读取每一行数据时,您使用 DefaultTableModel 的 addRow(...) 添加新的数据行。

使用上面的建议,无需读取文件两次。您似乎读取了一次文件以计算行数(但您从不使用“行”变量)。当您使用addRow(...) 方法时,TableModel 会动态增长

此外,在将数据保存到文件的代码中,无需使用 append 参数继续打开文件。该文件应在任何循环之外打开一次。然后你的逻辑只是将一行数据添加到文件中。在所有循环结束时,您关闭文件一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2014-02-28
    • 2013-05-08
    • 2018-09-01
    相关资源
    最近更新 更多