[英]Add Row to JTable and File
我使用此方法將新行添加到我的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;
}
}
我的書籍信息類:
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;
}
}
感謝幫助。
看起來你在文件中得到的是對該類對象的方法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;
}
}
在BookInformation
類中添加這樣的toString
方法
public String toString(){
return BookID + " " + BookDate + " " + BookName;
}
然后像這樣調用AddToFile()
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
確定應保留數據的格式。
這樣做的好處是允許程序的其他部分以統一的方式保存對象,如果格式發生變化(即添加新字段),它會在一個位置發生變化
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.