1

このメソッドを使用して、jtable とファイルにも新しい行を追加します。

しかし、追加ボタンをクリックすると、その新しいレコードがjtableに追加されましたが、テキストファイルを見ると、次のようなものが見つかりました:

myproject.Library.BookInformation@9899472

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

私のコード:

public class MainS extends JFrame{

   final AllBooks allBooks=new AllBooks();
   final JTable Btable=new JTable(allBooks);

   public MainS(){
       JButton AddBookButton=new JButton("Add New Book");
       AddBookButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) { 

           AddDialogS adddialog=new AddDialogS(MainS.this);
           adddialog.setVisible(true);
           BookInformation B_info=adddialog.getBookInfos();
           if(B_info != null){
               allBooks.AddRow(B_info);
           }
        }
    });

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

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

新しいレコードを追加するための 2 番目のクラス:

public class AddDialogS extends JDialog{
BookInformation bookinform=new BookInformation();

public AddDialogS(JFrame owner){
    super(owner,"Add New Book!", true);
    JButton OkButton=new JButton("Ok");
   final JTextField nameTF=new JTextField(10);
   JLabel namelbl=new JLabel("bookname");
   final JTextField dateTF=new JTextField(10);
   JLabel datelbl=new JLabel("bookDate");
   final JTextField idTF=new JTextField(10);
   JLabel IDlbl=new JLabel("bookId");


    OkButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            bookinform.setBookName(nameTF.getText().trim());
            bookinform.setBookDate(String.valueOf(dateTF.getText().trim()));
            bookinform.setBookID(String.valueOf(idTF.getText().trim()));
            AddDialogS.this.dispose();
        }
    });

    JPanel panel=new JPanel(new FlowLayout());
    panel.add(OkButton);
    panel.add(nameTF);
    panel.add(dateTF);
    panel.add(idTF);
    panel.add(namelbl);
    panel.add(datelbl);
    panel.add(IDlbl);
    this.add(panel);
    this.setBounds(10, 30, 400, 500);
}

public BookInformation getBookInfos(){
    return bookinform;
}
}

私のテーブルモデルクラス:

public class AllBooks extends AbstractTableModel{
BookInformation Binfos1=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(initializeBookInfos(line));
        }
        br.close();
    }
    catch(IOException ioe){

    }
}

public static BookInformation initializeBookInfos(String str){
    BookInformation Binit=new BookInformation();
    String[] bookCellArray=str.split("     ");
    Binit.setBookName(bookCellArray[0]);
    Binit.setBookDate(bookCellArray[1]);
    Binit.setBookID(bookCellArray[2]);
    return Binit;
}

public void AddRow(BookInformation bookinfo){
    if(AddToFile(bookinfo)){
        Bdata.add(bookinfo);
        fireTableRowsInserted(Bdata.size()-1, Bdata.size()-1);
    }
    else{
        JOptionPane.showMessageDialog(null, "Unable Add To File"+bookinfo.getBookName());
    }
}

public boolean AddToFile(String bookinfos){
    try{       
        PrintWriter Bpw=new PrintWriter(new FileOutputStream("AllBookRecords.txt",true));
        Bpw.println(bookinfos);
        return true;
    }
    catch(IOException ioe){
        return false;
    } 
}

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

}
}

私の 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

3 に答える 3

2

ファイルで得られるのは、このクラス myproject.Library.BookInformation のオブジェクトに対する toString() メソッド呼び出しの結果であるように見えます。

したがって、あなたの場合の最も簡単な修正は、 BookInformation の toString() メソッドをオーバーライドして、必要なものを返すことです。

public String toString() {
    return getBookName(); // Or whatever you see fit.
}

後で toString() に依存しないようにコードを変更したとしても、意味のある実装が損なわれることはありません。

別の回答とは異なり、toString() をオーバーライドする場合、AddToFile のコードを変更する必要はありません。ただし、BookingInformation のコードを変更しない場合、AddToFile を呼び出すときに、提案されたものと同様の文字列値を作成する必要があります。

AddToFile(bookinfo.getBookName()) // Or whatever you see fit.

もう 1 つのより良い方法は、BookingInformation をパラメーターとして受け入れるように AddToFile メソッドを変更することです。

public boolean AddToFile(BookingInformation bookinfos){
    try{       
    PrintWriter Bpw=new PrintWriter(new FileOutputStream("AllBookRecords.txt",true));
    Bpw.println(bookinfos.getBookName()); // Or whatever you see fit.
    return true;
    }
    catch(IOException ioe){
    return false;
    } 
}
于 2013-02-07T19:30:39.620 に答える
1

あなたが試すことができる解決策はいくつもあります。

メソッドを変更して、AddToFile必要に応じてオブジェクトのプロパティをフォーマットするように書き込むことができます。

これにより、モデルがファイルを書き込む形式が、モデルがファイルを読み戻すときに期待する形式になります。

public boolean AddToFile(BookInformation bookinfos){
    try{       
        PrintWriter Bpw=new PrintWriter(new FileOutputStream("AllBookRecords.txt",true));
        StringBuilder sb = new StringBuilder(64);
        sb.append(bookinfos.getBookID()).append(";");
        sb.append(bookinfos.getBookName()).append(";");
        sb.append(bookinfos.getBookID()).append(";");
        Bpw.println(sb.toString());
        return true;
    }
    catch(IOException ioe){
        return false;
   } 
}

もちろん、独自の形式と区切り文字を定義することもできます。これには、モデルが独自の形式を制御できるという利点があり、wouldを使用する場合のように、プログラムの他の部分に影響を与えることはありませんtoString()

または、クラスに読み取り/書き込みメソッドを記述しBookInformation、を渡して、データを保持する形式を決定PrintWriterできるようにすることもできます。BookInformation

これには、プログラムの他の部分がオブジェクトを均一に保存できるという利点があり、形式が変更された場合(つまり、新しいフィールドを追加した場合)、1つの場所で変更されます。

于 2013-02-07T20:29:45.467 に答える
1

クラスにこのようなメソッドをBookInformation追加しますtoString

public String toString(){
    return BookID + "     " + BookDate + "     " + BookName; 
}

そして、AddToFile()このように呼び出します

AddToFile(bookinfo.toString())

メソッドからAddRow

于 2013-02-07T19:30:48.937 に答える