java - 将txt加载到JTable时如何显示空列?

标签 java swing file-io jtable abstracttablemodel

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

这是示例数据:

 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;
    }
}

根据资料显示,本来会显示5列,但实际只显示4列,第3列因空而被跳过。我想将所有列显示到JTable,我该如何实现?据@hovercraft-full-of-eels当空列在表格中间时显示成功,但无法处理背面的空列。如何获得这个?

背面空列的数据示例:

102|Beth Reiser||New York|(212)5558725||||
111|Dylan Ricci||Syracuse|(315)5554486||||
116|Brian Gugliuzza||Mamaroneck|(914)5553817||||

最佳答案

这都是由于您使用了 StringTokenizer:您的标记生成器纯粹而简单地跳过了空列。首先,您应该简化您的问题 - 在没有任何 Swing 代码的情况下测试 StringTokenizer 对文本文件的解析,然后尝试之前修复它 添加任何 Swing 代码或制作 JTable。

查看使用 StringTokenizer 与在 \\| 上分割测试数据的结果:

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, 

关于java - 将txt加载到JTable时如何显示空列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11894735/

相关文章:

java - Android手写识别库

java - Jdoms 烦人的文本节点和 addContent(index, Element) - 模式解决方案?

java - 提高 Java 程序的性能

java - OpenJDK 与 Java HotspotVM

java PrintWritter 或 BufferedOutputStream 方法刷新在 Windows 2012 上不起作用

Java JLabel 背景颜色不起作用?

java - Scanner、nextInt 和 InputMismatchException

c - fread() 由于某种未知原因失败

java - 最大化 JFrame 会导致 MouseMoved 事件停止触发

java - 为什么我的文本区域没有更新?