[英]Load JTable data from txt
我的代码太大,无法在此处附加。 我将仅向您提供部分问题。
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)
代码的某些部分是希腊文,对不起
首先,论坛的重点不是让您转储堆栈跟踪,就好像您不知道Exception试图告诉您什么(这就是为什么此问题最初被关闭的原因)一样。
您要做的第一件事是在论坛上搜索ArrayIndexOutOfBoundsException
错误的其他问题。 使用论坛中的信息来解决(缩小范围)您的问题。
java.lang.ArrayIndexOutOfBoundsException: 1 >= 0
上面告诉您,您的索引值太大。
at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:664)
上面提供了更多信息,告诉您使用setValueAt(..)
方法时会发生此问题。 因此,其中一项指标是错误的。 确定哪个索引错误是您的工作。
在我看来,该问题可能与不了解DefaultTableModel在内部的工作方式有关。 也就是说,当您使用setValueAt(...)
方法时,DefaultTableModel不会自动为您创建存储。 如果模型的数据存储已经分配,则只能使用该方法。
您不会向我们显示在哪里创建DefaultTableModel。 因此,唯一的假设是您做错了。
解决问题的最简单方法是:
创建一个仅具有列名和0行的DefaultTableModel。 阅读DefaultTableModel API,以使用适当的构造函数。
然后,当您从文件读取数据的每一行时,请使用DefaultTableModel的addRow(...)
添加新的数据行。
使用上面的建议,无需阅读两次文件。 您似乎只读取了一次文件以计算行数(但随后您再也不会使用“ lines”变量)。 当您使用addRow(...)
方法时,TableModel会动态增长
同样,在将数据保存到文件的代码中,无需继续使用append参数打开文件。 该文件应在任何循环外打开一次。 然后,您的逻辑只需向文件添加一行数据。 在所有循环的最后,您关闭文件一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.