1

私の jtable は、テキスト ファイルを読み取って表示する必要があります。

すべてのデータを正しく読み取りますが、ファイルの最後の行レコードをすべての行で繰り返し表示するだけです。

私の間違いはどこですか?

私のテキストファイル:

uiui     898     666999
vvvv     6666     7777
hfsn     5356     56
ds     232     2212
bbnn     2013     211

My AllBooks クラス:

public class AllBooks extends AbstractTableModel{

BookInformation Binfos=new BookInformation();

String[] Bcol=new String[]{"Name","Date","Id"};
List<BookInformation> Bdata=new ArrayList<BookInformation>();

public AllBooks(){
    try{
        FileReader fr=new FileReader("AllBookRecords.txt");
        BufferedReader br=new BufferedReader(fr);
        String line;

        while( (line=br.readLine()) !=null){
            Bdata.add(initializeUserInfos(line));
        }
        br.close();
    }
    catch(IOException ioe){

    }
}

public BookInformation initializeUserInfos(String str){
    System.out.println(str);
    String[] bookCellArray=str.split("     ");
    Binfos.setBookName(bookCellArray[0]);
    Binfos.setBookDate(bookCellArray[1]);
    Binfos.setBookID(bookCellArray[2]);
    return Binfos;
}


@Override
public String getColumnName(int col){
    return Bcol[col];
}

@Override
public int getRowCount() {
    if(Bdata !=null){
    return Bdata.size();
    }
    else{
        return 0;
    }
}

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

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    BookInformation binfo=Bdata.get(rowIndex);
    Object value;

    switch(columnIndex){

        case 0:
            value=binfo.getBookName();
            break;
        case 1:
            value=binfo.getBookDate();
            break;
        case 2:
            value=binfo.getBookID();
            break;
        default :
            value="...";  
    }
    return value;

}

}

私の AllBooksM クラス:

public class AllBooksM {
   final AllBooks rbftl=new AllBooks();
   final JFrame Bframe=new JFrame("All Book List");
   final JTable Btable=new JTable(rbftl);


public AllBooksM(){

    JPanel Bpanel=new JPanel();
    Bpanel.setLayout(new FlowLayout());
    JScrollPane sp=new JScrollPane(Btable); 
    Bpanel.add(sp);
    Bframe.add(Bpanel);
    Btable.setAutoCreateRowSorter(true);
    Bframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Bframe.setBounds(300, 60, 550, 550);
    Bframe.setResizable(false);
    Bframe.setVisible(true);
}


public static void main(String[] args){
    new AllBooksM();
}
}

私の BookInformation クラス:

public class BookInformation {

private String BookName;
private String BookDate;
private String BookID;

public String getBookName() {
    return BookName;
}

public void setBookName(String book_name) {
    this.BookName = book_name;
}

public String getBookDate() {
    return BookDate;
}


public void setBookDate(String book_date) {
    this.BookDate = book_date;
}


public String getBookID() {
    return BookID;
}

public void setBookID(String Book_id) {
    this.BookID = Book_id;
}

}

ありがとう!

4

1 に答える 1

5

while ループの反復ごとに同じ BookInformation オブジェクトを使用しているため、反復ごとに新しいオブジェクトを作成する必要があります。それ以外の場合、同じオブジェクトがテーブル モデルのすべての行に保持され、同じ情報がすべての行に表示されます。

たとえば、このようなことを行うことで解決できます。

public BookInformation initializeUserInfos(String str){
    System.out.println(str);
    String[] bookCellArray=str.split("     ");

    // create and use a local BookInformation variable and object:
    BookInformation bInfos = new BookInformation(); // *****

    bInfos.setBookName(bookCellArray[0]);
    bInfos.setBookDate(bookCellArray[1]);
    bInfos.setBookID(bookCellArray[2]);
    return bInfos;
}
于 2013-02-06T22:19:37.133 に答える