我使用此方法将新行添加到我的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;
}
}
感谢您的帮助。
答案 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
确定应保留数据的格式。
这样做的好处是允许程序的其他部分以统一的方式保存对象,如果格式发生变化(即添加新字段),它会在一个位置发生变化