Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向JTable和File添加行_Java_Swing_Jtable_Abstracttablemodel - Fatal编程技术网

Java 向JTable和File添加行

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

我也使用这种方法向jtable和文件中添加新行

但当我单击add按钮时,新记录被添加到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;

}
}

感谢您的帮助。

看起来您在文件中得到的是对此类对象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()。这是一种更好的设计方法。