【问题标题】:JTable not getting populated from .txtfileJTable 未从 .text 文件中填充
【发布时间】:2012-06-20 09:24:44
【问题描述】:

我有一个包含以下数据的 .txt 文件(注意:文件中的数据会定期更新,所以我不知道确切的行数)。我的 Java 应用程序在 JTable 中显示这些数据。这是我的 txt 文件:

root         1     0  0 09:49 ?        00:00:00 init [5]  
root         2     0  0 09:49 ?        00:00:00 [kthreadd]
root         3     2  0 09:49 ?        00:00:00 [ksoftirqd/0]
root         4     2  0 09:49 ?        00:00:00 [kworker/0:0]
root         6     2  0 09:49 ?        00:00:00 [migration/0]
root         7     2  0 09:49 ?        00:00:00 [watchdog/0]

我为它编码的是:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
public class Reader {

    public Reader(){
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        BufferedReader reader;
        try {
            reader = new BufferedReader(new InputStreamReader(new FileInputStream("ProcessList.txt")));
            Map<String, Object[]> result = new LinkedHashMap<String, Object[]>();
            while(reader.ready()){
                String line = reader.readLine();
                String[] values = line.split("\\s+");
                String key = values [0] +"&"+values[4] +"&"+values[5]+"&"+values[6]+"&"+values[7];
                String uid = values [0];

                String strtime = values [4];
                String tty = values [5];
                String etime = values [6];
                String command =  values [7];
                Integer pid = 0;
                Integer pri = 0;
                Integer uti = 0;
                if (result.containsKey(key)) {
                    pid = (Integer) ((Object[]) result.get(key))[1];
                    pri = (Integer) ((Object[]) result.get(key))[2];
                    uti = (Integer) ((Object[]) result.get(key))[3];
                }
                else {}
                result.put(key, new Object[]{uid,pid,pri,uti,strtime,tty,etime,command});
            }
            ArrayList arrayList = new ArrayList(result.values());
            JTable table = new JTable(new PTablemodel(arrayList));
            panel.add(new JScrollPane(table));
            reader.close();
            frame.setContentPane(panel);
            frame.setVisible(true);
            frame.pack();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();        
        }
        catch(IOException e) {
            e.printStackTrace();
        }

    }
    public static void main (String [] args){
        new Reader();
    }
    public class PTablemodel implements TableModel{

        final Class[] ColumnClass = new Class[]{String.class, Integer.class, Integer.class,Integer.class, String.class, String.class,String.class, String.class};


        final String[] columnname = new String[]{"User","PID","Priority","Utilization","TTY","StartTime","EndTime","Command"};
        List values = null;
        public PTablemodel (List values){
            this.values = values;
        }
        @Override
        public void addTableModelListener(TableModelListener l) {
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return ColumnClass[columnIndex];
        }

        @Override
        public int getColumnCount() {
            return ColumnClass.length;
        }

        @Override
        public String getColumnName(int columnIndex) {
            return columnname[columnIndex];
        }

        @Override
        public int getRowCount() {
            return values.size();
        } 

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            return ((Object[]) values.get(rowIndex))[columnIndex];
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return false;
        }

        @Override
        public void removeTableModelListener(TableModelListener l) {
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        }
    }
}

我得到的实际上不是错误,而是捕获了异常。任何人都可以指导我吗?我使用“&”作为分词器。

注意:编译器是这样说的:

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at Reader.<init>(Reader.java:30)
at Reader.main(Reader.java:65)

【问题讨论】:

  • 请将异常输出添加到问题中。
  • 顺便说一句。谁格式化了那个代码,你的狗?请对代码块使用一致且合乎逻辑的缩进。
  • @AndrewThompson 很抱歉代码的缩进给你带来了麻烦。你可以从我的愚蠢问题中看出我对开发有多新。感谢您提供代码。下次我肯定会处理命名约定和缩进。再次感谢:)

标签: java swing user-interface file-io jtable


【解决方案1】:

您在while-loop 中获得了一个NullPointerException,用于读取输入。您应该测试reader.readLine() 不会返回null。如果是,则表示您已到达输入的末尾。

你可以这样做:

while((String line = reader.readLine())!=null) {
     ...
}

【讨论】:

    【解决方案2】:

    此代码是基于您的 SSCCE,表明它是文件读取代码中的内容。

    输出

    File - exists: true I:\projects\eclipse\Test\ProcessList.txt
    Frame is visible
    File - exists: false I:\projects\eclipse\Test\ProcessList1.txt
    java.io.FileNotFoundException: ProcessList1.txt (The system cannot find the file specified)
         ...
    

    代码

    package test.t100.t001;
    
    import java.io.*;
    import java.util.*;
    
    import javax.swing.*;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.TableModel;
    public class Reader {
    
        static String name = "ProcessList";
    
        public Reader(String name){
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel panel = new JPanel();
            BufferedReader reader;
            try {
                File f = new File(name);
                System.out.println("File - exists: " + f.exists() + " " + f.getAbsolutePath());
                reader = new BufferedReader(
                        new InputStreamReader(
                                new FileInputStream(f)));
                Map<String, Object[]> result = new LinkedHashMap<String, Object[]>();
                while(reader.ready()){
                    String line = reader.readLine();
                    String[] values = line.split("\\s+");
                    String key = values [0] +"&"+values[4] +"&"+values[5]+"&"+values[6]+"&"+values[7];
                    String uid = values [0];
    
                    String strtime = values [4];
                    String tty = values [5];
                    String etime = values [6];
                    String command =  values [7];
                    Integer pid = 0;
                    Integer pri = 0;
                    Integer uti = 0;
                    if (result.containsKey(key)) {
                        pid = (Integer) ((Object[]) result.get(key))[1];
                        pri = (Integer) ((Object[]) result.get(key))[2];
                        uti = (Integer) ((Object[]) result.get(key))[3];
                    }
                    else {}
                    result.put(key, new Object[]{uid,pid,pri,uti,strtime,tty,etime,command});
                }
                ArrayList arrayList = new ArrayList(result.values());
                JTable table = new JTable(new PTablemodel(arrayList));
                panel.add(new JScrollPane(table));
                reader.close();
                frame.setContentPane(panel);
                frame.setVisible(true);
                frame.pack();
                System.out.println("Frame is visible");
            }
            catch (FileNotFoundException e) {
                e.printStackTrace();        
            }
            catch(IOException e) {
                e.printStackTrace();
            }
    
        }
        public static void main (String [] args) throws IOException{
            String s = 
                    "root         1     0  0 09:49 ?        00:00:00 init [5]\n" +  
                    "root         2     0  0 09:49 ?        00:00:00 [kthreadd]\n" +
                    "root         3     2  0 09:49 ?        00:00:00 [ksoftirqd/0]\n" +
                    "root         4     2  0 09:49 ?        00:00:00 [kworker/0:0]\n" +
                    "root         6     2  0 09:49 ?        00:00:00 [migration/0]\n" +
                    "root         7     2  0 09:49 ?        00:00:00 [watchdog/0]\n";
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            FileOutputStream fos = new FileOutputStream(name + ".txt");
            fos.write(s.getBytes());
            new Reader(name + ".txt");
            new Reader(name + "1.txt");
        }
        public class PTablemodel implements TableModel{
    
            final Class[] ColumnClass = new Class[]{String.class, Integer.class, Integer.class,Integer.class, String.class, String.class,String.class, String.class};
    
    
            final String[] columnname = new String[]{"User","PID","Priority","Utilization","TTY","StartTime","EndTime","Command"};
            List values = null;
            public PTablemodel (List values){
                this.values = values;
            }
            @Override
            public void addTableModelListener(TableModelListener l) {
            }
    
            @Override
            public Class<?> getColumnClass(int columnIndex) {
                return ColumnClass[columnIndex];
            }
    
            @Override
            public int getColumnCount() {
                return ColumnClass.length;
            }
    
            @Override
            public String getColumnName(int columnIndex) {
                return columnname[columnIndex];
            }
    
            @Override
            public int getRowCount() {
                return values.size();
            } 
    
            @Override
            public Object getValueAt(int rowIndex, int columnIndex) {
                return ((Object[]) values.get(rowIndex))[columnIndex];
            }
    
            @Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return false;
            }
    
            @Override
            public void removeTableModelListener(TableModelListener l) {
            }
    
            @Override
            public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            }
        }
    }
    

    【讨论】:

    • 请学习java命名约定并遵守它们。 :::-)))
    • @kleopatra 对不起,我的眼睛还在因为压痕而流泪。在那种状态下,我无法仔细查看代码! ;)
    • @AndrewThompson 很抱歉发布“不完全缩进”代码并感谢您的回答,但我无法用我的 txt 文件的内容初始化搅拌,因为 txt 文件是由另一个代码自动生成的,什么这样做的目的是它会将 txt 文件的内容读取到 JTable 中。你能指导我吗? :)
    • 发布异常堆栈跟踪。
    • 事实上,运行最新的代码(与发布的完全相同)并复制/粘贴输出作为对问题的编辑,以及您对代码中问题的评估以及如何修复它。我觉得我在这里用勺子喂你。请放开你的努力,因为我对此没有太大的耐心。
    【解决方案3】:

    如果您收到 FileNotFoundException- 确保将 ProcessList.txt 文件保存在项目根目录中。

    如果您从命令提示符编译和运行它们,请确保 ProcessList.txt 文件位于 .class 文件所在的同一位置。

    【讨论】:

    • “确保 ProcessList.txt 文件与 .class 文件所在的位置相同。” 最好通过以下方式确定如何访问资源从运行时类路径的根开始的路径。
    • @AndrewThompson 该文件与 .class 文件所在的位置相同。 :(
    【解决方案4】:

    此页面似乎发生了很大变化。按照我写这篇文章时的样子,你在第 30 行有一个错误的数组索引。具体来说,你试图获取数组 value 的元素 4,而且奇怪的是,它没有一个。我不是正则表达式专家,但可能是您在line.split("\\s+") 中有一个额外的反斜杠。如果这是正确的,那么您正在读取的数据有问题。您可以从打印出line(或在调试器中检查)开始,或者只是处理实际情况。可能只是输入中有一个或多个空行或空行,在查看文件时看不到,但不幸的是,readLine() 看到了。

    (我经常写自己的readLine,这样我就可以去掉无法打印的字符和多行换行符之类的——所以我不会对编写文件的人或他们用来编写文件的软件心存怜悯。但是在这里你甚至可能想忽略像“aaa”这样的行,它会通过我的强迫读行。)

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2010-09-22
      • 2015-09-09
      • 1970-01-01
      相关资源
      最近更新 更多