将行添加到JTable和文件

时间:2013-02-07 19:23:13

标签: java swing jtable abstracttablemodel

我使用此方法将新行添加到我的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();
   }
}

添加新记录的第二课:

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;

}
}

My BookInformation Class:

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

看起来你在文件中得到的是对该类对象的方法toString()调用的结果:myproject.Library.BookInformation。

因此,您的案例中最快的修复方法是覆盖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.

另一种更好的方法是修改AddToFile方法以接受BookingInformation作为参数。

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

答案 1 :(得分:1)

BookInformation课程中添加toString这样的方法

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

然后像这样调用AddToFile()

AddToFile(bookinfo.toString())

来自AddRow方法。

答案 2 :(得分: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;
   } 
}

您当然可以定义自己的格式和分隔符。这样做的好处是允许模型控制它自己的格式,并且不会影响程序的任何其他部分,例如使用toString()

另外,您可以在BookInformation类中编写读/写方法,传入PrintWriter并允许BookInformation确定应保留数据的格式。

这样做的好处是允许程序的其他部分以统一的方式保存对象,如果格式发生变化(即添加新字段),它会在一个位置发生变化