Java 如何在将txt加载到JTable时显示空列?

Java 如何在将txt加载到JTable时显示空列?,java,swing,file-io,jtable,abstracttablemodel,Java,Swing,File Io,Jtable,Abstracttablemodel,我需要使用分隔符将.txt加载到JTable,我发现了一个很好的示例 以下是示例数据: 102|Beth Reiser||New York|(212)5558725 111|Dylan Ricci||Syracuse|(315)5554486 116|Brian Gugliuzza||Mamaroneck|(914)5553817 120|Gertrude Stein||Elmsford|(914)5553476 131|Daljit Sinnot||Bohemia|(516)5559

我需要使用
分隔符将.txt加载到
JTable
,我发现了一个很好的示例

以下是示例数据:

 102|Beth Reiser||New York|(212)5558725
 111|Dylan Ricci||Syracuse|(315)5554486
 116|Brian Gugliuzza||Mamaroneck|(914)5553817
 120|Gertrude Stein||Elmsford|(914)5553476
 131|Daljit Sinnot||Bohemia|(516)5559811
这是我修改过的代码:

package Model;

import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;

public class DataFileTableModel extends AbstractTableModel {

    protected Vector data;
    protected Vector columnNames ;
    protected String datafile;

    public DataFileTableModel(String f, String delimiter){
        datafile = f;
        initVectors(delimiter);
    }

    public void initVectors(String delimiter) {

        String aLine ;
        data = new Vector();
        columnNames = new Vector();
        int lineNum=0;

        try {
            FileInputStream fin =  new FileInputStream(datafile);
            BufferedReader br = new BufferedReader(new InputStreamReader(fin));
            // extract column names
            StringTokenizer st1 =
                    new StringTokenizer(br.readLine(), delimiter);
            while(st1.hasMoreTokens())
                columnNames.addElement(st1.nextToken());
            // extract data
            while ((aLine = br.readLine()) != null && lineNum<20) {
                StringTokenizer st2 =
                        new StringTokenizer(aLine, delimiter);
                lineNum++;
                while(st2.hasMoreTokens())
                    data.addElement(st2.nextToken());
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public int getRowCount() {
        return data.size() / getColumnCount();
    }

    public int getColumnCount(){
        return columnNames.size();
    }

    public String getColumnName(int columnIndex) {
        String colName = "";

        if (columnIndex <= getColumnCount())
            colName = (String)columnNames.elementAt(columnIndex);

        return colName;
    }

    public Class getColumnClass(int columnIndex){
        return String.class;
    }

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

    public Object getValueAt(int rowIndex, int columnIndex) {
        return (String)data.elementAt( (rowIndex * getColumnCount()) + columnIndex);
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        return;
    }
}

列的大小可能是0px。要查看您的列,为什么不在列中写入空格字符
'

这都是由于您使用了StringTokenizer:您的标记器跳过了空列。首先,您应该简化您的问题——测试StringTokenizer在不使用任何Swing代码的情况下对文本文件的解析,然后在添加任何Swing代码或创建JTable之前尝试修复它

查看使用StringTokenizer与在
\\\\\\124;
上拆分测试数据的结果:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class DataFileFoo {
   private static final String DATA_FILE_PATH = "datafile.txt";
   private static final String DELIMITER = "|";
   private static final String SPLIT_REGEX = "\\|";

   public static void main(String[] args) {
      System.out.println("usingStringTokenizer()");
      usingStringTokenizer();

      System.out.println();
      System.out.println("usingStringSplit();");
      usingStringSplit();
   }

   public static void usingStringTokenizer() {
      File datafile = new File(DATA_FILE_PATH);
      try {
         FileInputStream fin = new FileInputStream(datafile);
         BufferedReader br = new BufferedReader(new InputStreamReader(fin));
         // extract column names
         String aLine = "";
         while ((aLine = br.readLine()) != null) {
            StringTokenizer st2 = new StringTokenizer(aLine, DELIMITER);
            while (st2.hasMoreTokens()) {
               System.out.print(st2.nextToken() + ", ");
            }
            System.out.println();

         }
         br.close();
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   public static void usingStringSplit() {
      File datafile = new File(DATA_FILE_PATH);
      try {
         FileInputStream fin = new FileInputStream(datafile);
         BufferedReader br = new BufferedReader(new InputStreamReader(fin));
         // extract column names
         String aLine = "";
         while ((aLine = br.readLine()) != null) {
            String[] tokens = aLine.split(SPLIT_REGEX);
            for (String token : tokens) {
               System.out.print(token + ", ");
            }
            System.out.println();

         }
         br.close();
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}
使用您的数据文件

 102|Beth Reiser||New York|(212)5558725
 111|Dylan Ricci||Syracuse|(315)5554486
 116|Brian Gugliuzza||Mamaroneck|(914)5553817
 120|Gertrude Stein||Elmsford|(914)5553476
 131|Daljit Sinnot||Bohemia|(516)5559811
这将返回:

usingStringTokenizer()
 102, Beth Reiser, New York, (212)5558725, 
 111, Dylan Ricci, Syracuse, (315)5554486, 
 116, Brian Gugliuzza, Mamaroneck, (914)5553817, 
 120, Gertrude Stein, Elmsford, (914)5553476, 
 131, Daljit Sinnot, Bohemia, (516)5559811, 

usingStringSplit();
 102, Beth Reiser, , New York, (212)5558725, 
 111, Dylan Ricci, , Syracuse, (315)5554486, 
 116, Brian Gugliuzza, , Mamaroneck, (914)5553817, 
 120, Gertrude Stein, , Elmsford, (914)5553476, 
 131, Daljit Sinnot, , Bohemia, (516)5559811, 

不要使用StringTokenizer。改用
String#split(…)
。即使是StringTokenizer API也会告诉你这一点。是的,当我更改示例数据时,它是有效的。但是,如果用户必须在加载之前先更改数据,这是不可能的。无论如何,回复的thx列的最小大小为10(像素亮度为),但不在默认设置中:如果存在,它将显示与所有其他列相同的宽度。黑客们喜欢仅仅因为找不到真正的问题就写虚拟数据。。。邪恶;-)既然你发表了评论,我就尝试实现
String#split()
,但我的错误。。我被分割值卡住了,我只使用
“|”
而不使用
“\\\\\”
。现在问题解决了,谢谢气垫船先生。如果后面有空值,如何获取?当我试着读数据时,我试着读数据时这样的数据时,我试着读数据时这样的数据时,我试着读数据时这样的数据时,我读数据时这样的数据时,当我读数据时这样的数据时,当我试着读数据时这样的数据时,我试着读数据时这样的数据时,我想这<代码>代码>代码>代码>102>102>102>102>102,贝斯10 10 10 10 10 10 10,纽约纽约,纽约纽约(212)12)55585 5 5 5五五五五五五五五五五五五五五五五五五五五五五五五五五五,纽约,纽约,纽约,纽约,纽约,纽约,纽约,纽约,纽约州(12(12(12)号(12)号(212)5,纽约(212)5)5)55585,纽约(12)55585,纽约(12)5,纽约(12)5,纽约(12)号,纽约(12)号(12)Daljit Sinnot | | | | | | |(516)5559811 | | | | | |
使用拆分,它将显示到第五列try use
split(String regex,int limit)
,int)?+1,以获得深入问题核心的建议(并实际执行:-),尽管对标记器无法处理它感到惊讶。。应该吗?@Ghost\u 000\u cs如果列数发生动态变化,我如何获得
限制
值?
usingStringTokenizer()
 102, Beth Reiser, New York, (212)5558725, 
 111, Dylan Ricci, Syracuse, (315)5554486, 
 116, Brian Gugliuzza, Mamaroneck, (914)5553817, 
 120, Gertrude Stein, Elmsford, (914)5553476, 
 131, Daljit Sinnot, Bohemia, (516)5559811, 

usingStringSplit();
 102, Beth Reiser, , New York, (212)5558725, 
 111, Dylan Ricci, , Syracuse, (315)5554486, 
 116, Brian Gugliuzza, , Mamaroneck, (914)5553817, 
 120, Gertrude Stein, , Elmsford, (914)5553476, 
 131, Daljit Sinnot, , Bohemia, (516)5559811,