1

.txt ファイルからデータを読み取り、テーブルに送信したいと考えています。私は何をすべきか?私のコード:

public class InsertFileDataToJTable extends AbstractTableModel {
    Vector data;
    Vector columns;

    public InsertFileDataToJTable() {
            String line;
            data = new Vector();
            columns = new Vector();
            try {
                    FileInputStream fis = new FileInputStream("student.txt");
                    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                    StringTokenizer st1 = new StringTokenizer(br.readLine(), " ");
                    while (st1.hasMoreTokens())
                            columns.addElement(st1.nextToken());
                    while ((line = br.readLine()) != null) {
                            StringTokenizer st2 = new StringTokenizer(line, " ");
                            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 columns.size();
    }

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

    public static void main(String s[]) {
            InsertFileDataToJTable model = new InsertFileDataToJTable();
            JTable table = new JTable();
            table.setModel(model);
            JScrollPane scrollpane = new JScrollPane(table);
            JPanel panel = new JPanel();
            panel.add(scrollpane);
            JFrame frame = new JFrame();
            frame.add(panel, "Center");
            frame.pack();
            frame.setVisible(true);
    }
}

助けてください!ありがとうございました。

4

3 に答える 3

6

コードでどのような問題が発生していますか?

モデルから列名を取得する方法がないため、列名がデフォルトのA、Bになることを除いて、コードを実行しましたが、完全に機能しました。メソッド getValueAt() を実装し、完全に機能しています。上記のクラスに列名の新しいメソッドを追加するだけです:

public String getColumnName(int i){
    return (String)columns.get(i);
}

他に問題がある場合は、お知らせください。2列のみを使用して実行したため、 getValueAt() メソッドを完全にテストしていません。

于 2012-12-15T13:09:33.473 に答える
4

あなたのコードを取得してコンパイルしたところ、問題なく動作しました。正しいインポートを行っていることと、入力ファイルがパスにあることを確認してください。ie("student.txt" は、Java ファイルと同じフォルダーにある必要があります)。

JavaDoc はStringTokenizerについてこれを述べています

トークナイザーは、既定の区切り文字セットである " \t\n\r\f" (スペース文字、タブ文字、改行文字、キャリッジ リターン文字、およびフォーム フィード文字) を使用します。

したがって、デフォルトの区切り文字を使用しているため、入力ファイルのフィールドがこれらを使用していることを確認してください。

次のインポートを使用して機能させました

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


public class InsertFileDataToJTable extends AbstractTableModel {
 // the rest of the code is same as yours

}

于 2012-12-15T13:06:07.763 に答える
3

コードでお知らせしたい重要な懸念事項が 1 つあります。テーブルモデルにすべてを書きました。テーブル モデル クラスには、 、、、、メソッドなどcolumn names、テーブルに必要なモデルのみを含める必要があります。UI用に別途クラスを作成し、テーブルを作成してからモデルを作成し、モデルをテーブルに設定してください。(コードがSSCCEだけの場合は問題ありません。それ以外の場合は、UI とロジックを分離してください。)column countrow countcolumn classgetValueAtsetValueAt

このコードの問題は、実装する場合AbstractTableModel、列名の設定、値の設定、値の取得など、テーブルに必要なすべてのメソッドを実装する必要があることです。これで列名を設定していません。

使用する特定の理由がある場合は、問題ありませんAbstractTableModel。それ以外の場合はDefaultTableModel、ほとんどすべての必要なメソッドが実装されています。

于 2012-12-15T16:28:16.260 に答える