2

JTableで.txtをロードする必要があります。ここdelimiterで良いサンプルを見つけました。

これはサンプルデータです:

 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||||
4

2 に答える 2

3

これはすべて、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, 
于 2012-08-10T03:03:08.160 に答える
-1

列のサイズは0pxの場合があります。列を表示するには、列にスペース文字' 'を書き込んでみませんか?

于 2012-08-10T02:54:26.870 に答える