Java 向JTable和File添加行
我也使用这种方法向jtable和文件中添加新行 但当我单击add按钮时,新记录被添加到jtable中,但当我看到文本文件时,我发现如下内容: myproject.Library。BookInformation@9899472 我的错在哪里 我的代码:Java 向JTable和File添加行,java,swing,jtable,abstracttablemodel,Java,Swing,Jtable,Abstracttablemodel,我也使用这种方法向jtable和文件中添加新行 但当我单击add按钮时,新记录被添加到jtable中,但当我看到文本文件时,我发现如下内容: myproject.Library。BookInformation@9899472 我的错在哪里 我的代码: public class MainS extends JFrame{ final AllBooks allBooks=new AllBooks(); final JTable Btable=new JTable(allBooks);
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;
}
}
感谢您的帮助。看起来您在文件中得到的是对此类对象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.
另一个更好的方法是修改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;
}
}
看起来您在文件中得到的是对此类对象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.
另一个更好的方法是修改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;
}
}
在
BookInformation
类中添加一个toString
方法,如下所示
public String toString(){
return BookID + " " + BookDate + " " + BookName;
}
然后像这样调用AddToFile()
public String toString(){
return BookID + " " + BookDate + " " + BookName;
}
AddToFile(bookinfo.toString())
从
AddRow
方法中。在书籍信息
类中添加一个toString
方法,如下所示
public String toString(){
return BookID + " " + BookDate + " " + BookName;
}
然后像这样调用AddToFile()
public String toString(){
return BookID + " " + BookDate + " " + BookName;
}
AddToFile(bookinfo.toString())
从
AddRow
方法。您可以尝试许多解决方案
您可以修改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
确定应维护数据的格式
这样做的好处是允许程序的其他部分以统一的方式保存对象,并且如果格式发生变化(即添加新字段),它会在一个位置发生变化,您可以尝试多种解决方案
您可以修改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
确定应维护数据的格式
这样做的好处是允许程序的其他部分以统一的方式保存对象,并且如果格式发生变化(即添加新字段),它会在一个位置发生变化这只是一个示例。任何字符串都可以在那里制作。我只是不确定文件中需要什么以及是哪种格式。这就是为什么我要添加注释//或任何您认为合适的内容。我建议您尝试修改AddToFile()。这是一个更好的设计方法。这只是一个例子。任何字符串都可以在那里制作。我只是不确定文件中需要什么以及是哪种格式。这就是为什么我要添加注释//或任何您认为合适的内容。我建议您尝试修改AddToFile()。这是一种更好的设计方法。