Java JTable单元格值更改对文本文件的影响

Java JTable单元格值更改对文本文件的影响,java,swing,jtable,actionlistener,abstracttablemodel,Java,Swing,Jtable,Actionlistener,Abstracttablemodel,我使用此方法更改表格单元格值, 它会在jtable上更改,但不会在文本文件上更改 public class user_AllBooks extends AbstractTableModel { BookInformation book_info = new BookInformation(); String[] columns = new String[]{"Book Name", "Book Date", "Book ID", "Borrow Status"}; Ar

我使用此方法更改表格单元格值, 它会在jtable上更改,但不会在文本文件上更改

public class user_AllBooks extends AbstractTableModel {

    BookInformation book_info = new BookInformation();
    String[] columns = new String[]{"Book Name", "Book Date", "Book ID", "Borrow Status"};
    ArrayList<BookInformation> bData = new ArrayList<BookInformation>();

    public user_AllBooks() {
        try {
            BufferedReader br = new BufferedReader(new FileReader("AllBookRecords.txt"));
            String line;
            while ((line = br.readLine()) != null) {
                bData.add(initializeBookData(line));
            }
            br.close();
        } catch (IOException ioe) {
        }
    }

    public BookInformation initializeBookData(String myline) {
        BookInformation book_infos = new BookInformation();
        String[] celledLine = myline.split("     ");
        book_infos.setBookName(celledLine[0]);
        book_infos.setBookDate(celledLine[1]);
        book_infos.setBookID(celledLine[2]);
        book_infos.setBorrowStatus(celledLine[3]);
        return book_infos;
    }

    @Override
    public String getColumnName(int col) {
        return columns[col];
    }

    @Override
    public int getRowCount() {
        if (bData != null) {
            return bData.size();
        } else {
            return 0;
        }
    }

    @Override
    public int getColumnCount() {
        return columns.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        BookInformation bookInf = bData.get(rowIndex);
        Object value;

        switch (columnIndex) {
            case 0:
                value = bookInf.getBookName();
                break;
            case 1:
                value = bookInf.getBookDate();
                break;
            case 2:
                value = bookInf.getBookID();
                break;
            case 3:
                value = bookInf.getBorrowStatus();
                break;
            default:
                value = "...";
        }
        return value;
    }


    @Override
  public void setValueAt(Object value, int row, int col)
    {
    BookInformation book_infos = bData.get(row);
    if (col==0)
    book_infos.setBookName((String)value);
    else if (col==1)
    book_infos.setBookDate((String)value);
    else if (col==2)
    book_infos.setBookID((String)value);
    else if (col==3)
    book_infos.setBorrowStatus((String)value);
    }
    }
我的文本文件:

sds wew     88     77     no
moon     889     988     yes
ccc     30     33     no
testing     76     77     no
yes     999     444     no
hoop     100     200     no
name     60     20     no
pp     14     15     no
vbnet     49     94     yes
sdsd     232     dsds     no
gh     12     21     no
khoyBook     322     233     no

将TableModelListener添加到TableModel。然后,无论何时第一次发生更新事件,您都需要遍历TableModel的行/列并重新创建文本文件

您的TableModel实现不正确。您尚未实现setValueAt(…)方法


应从TableModel的setValueAt()方法调用“fireTableRowsUpdated()”方法。不应从ActionListener代码中调用它。

将TableModelListener添加到TableModel。然后,无论何时第一次发生更新事件,您都需要遍历TableModel的行/列并重新创建文本文件

您的TableModel实现不正确。您尚未实现setValueAt(…)方法


应从TableModel的setValueAt()方法调用“fireTableRowsUpdated()”方法。不应从ActionListener代码调用它。

要在单元格值更改时更改文件内容,应将
TableModelListener
注册到关联的
TableModel
。并在
tableChanged
方法中实现文件写入逻辑
下面是示例代码,演示如何实现
TableModelListener
。我希望这将为您提供实现任务的良好视角:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.event.TableModelListener;
import javax.swing.event.TableModelEvent;
import javax.swing.table.TableModel;
import javax.swing.table.AbstractTableModel;
class TableDemo extends JFrame  implements TableModelListener
{
    private JTable table;
    private JScrollPane jsPane;
    private TableModel myModel;
    private JLabel label;
    public void prepareAndShowGUI()
    {
        myModel = new MyModel();
        table = new JTable(myModel);
        jsPane = new JScrollPane(table);
        label = new JLabel();
        myModel.addTableModelListener(this);
        getContentPane().add(jsPane);
        getContentPane().add(label,BorderLayout.SOUTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
    @Override
    public void tableChanged ( TableModelEvent evt)
    {
        int row = evt.getFirstRow();
        int col = evt.getColumn();
        label.setText("Value at ["+row+"]["+col+"] is changed to: "+myModel.getValueAt(row,col));
           //Write to your file here.
    }
    private class MyModel extends AbstractTableModel 
    {
        String[] columns = {
                            "Roll No.",
                            "Name"
                            };
        String[][] inData = {
                                {"1","Anthony Hopkins"},
                                {"2","James William"},
                                {"3","Mc. Donald"}
                            };
        @Override
        public void setValueAt(Object value, int row, int col)
        {
            inData[row][col] = (String)value;
            fireTableCellUpdated(row,col);
        }
        @Override
        public Object getValueAt(int row, int col)
        {
            return inData[row][col];
        }
        @Override
        public int getColumnCount()
        {
            return columns.length;
        }
        @Override 
        public int getRowCount()
        {
            return inData.length;
        }
        @Override
        public String getColumnName(int col)
        {
            return columns[col];
        }
        @Override 
        public boolean isCellEditable(int row, int col)
        {
            return true;
        }
    }
    public static void main(String st[])
    {
        SwingUtilities.invokeLater( new Runnable()
        {
            @Override
            public void run()
            {
                TableDemo td = new TableDemo();
                td.prepareAndShowGUI();
            }
        });
    }
}

要在单元格值更改时更改文件内容,应将
TableModelListener
注册到关联的
TableModel
。并在
tableChanged
方法中实现文件写入逻辑
下面是示例代码,演示如何实现
TableModelListener
。我希望这将为您提供实现任务的良好视角:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.event.TableModelListener;
import javax.swing.event.TableModelEvent;
import javax.swing.table.TableModel;
import javax.swing.table.AbstractTableModel;
class TableDemo extends JFrame  implements TableModelListener
{
    private JTable table;
    private JScrollPane jsPane;
    private TableModel myModel;
    private JLabel label;
    public void prepareAndShowGUI()
    {
        myModel = new MyModel();
        table = new JTable(myModel);
        jsPane = new JScrollPane(table);
        label = new JLabel();
        myModel.addTableModelListener(this);
        getContentPane().add(jsPane);
        getContentPane().add(label,BorderLayout.SOUTH);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
    @Override
    public void tableChanged ( TableModelEvent evt)
    {
        int row = evt.getFirstRow();
        int col = evt.getColumn();
        label.setText("Value at ["+row+"]["+col+"] is changed to: "+myModel.getValueAt(row,col));
           //Write to your file here.
    }
    private class MyModel extends AbstractTableModel 
    {
        String[] columns = {
                            "Roll No.",
                            "Name"
                            };
        String[][] inData = {
                                {"1","Anthony Hopkins"},
                                {"2","James William"},
                                {"3","Mc. Donald"}
                            };
        @Override
        public void setValueAt(Object value, int row, int col)
        {
            inData[row][col] = (String)value;
            fireTableCellUpdated(row,col);
        }
        @Override
        public Object getValueAt(int row, int col)
        {
            return inData[row][col];
        }
        @Override
        public int getColumnCount()
        {
            return columns.length;
        }
        @Override 
        public int getRowCount()
        {
            return inData.length;
        }
        @Override
        public String getColumnName(int col)
        {
            return columns[col];
        }
        @Override 
        public boolean isCellEditable(int row, int col)
        {
            return true;
        }
    }
    public static void main(String st[])
    {
        SwingUtilities.invokeLater( new Runnable()
        {
            @Override
            public void run()
            {
                TableDemo td = new TableDemo();
                td.prepareAndShowGUI();
            }
        });
    }
}


请编辑您的问题,包括一个包含样本数据、排除虚假细节并显示如何写入文件的问题;不要接受异常。@垃圾神我添加文本文件…我添加setValueAt方法…请编辑您的问题,使其包含样本数据,排除虚假细节,并显示如何写入文件;不要接受异常。@垃圾神我添加文本文件…我添加setValueAt方法…你能给我解释更多并为我编写这个TableModelListener吗?@Sajjad HiFriend:Search
java教程TableModelListener
@Sajjad HiFriend你需要看看你能给我解释更多并为我编写这个TableModelListener吗?@Sajjad HiFriend:搜索
java教程tablemodellistener
@Sajjad HiFriend您需要了解一下您可以编写我的write to file方法吗?应该写入什么文件?我应该写入一行还是一个单元格值?我的表行中的每行有4个元素。@Sajjad HiFriend:文件i/O没有那么复杂。您应该在
tableChanged
方法中创建新文件。迭代
表格模型的每个单元格
并检索值。将每个值添加到
StringBuilder
。在将单元格值添加到
StringBuffer
后,为每行添加
“\t”
StringBuffer
。读取一行后,将
“\n”
添加到
StringBuffer
。在整个
表格
被读取后,使用FileWriter或
BufferedWriter
将StringBuffer的内容写入到文件中,您可以写入我的写入文件方法吗?应该写入到文件中的内容是什么?我应该写入到文件中的行还是单元格值?我表格行中的每行有4个元素。@Sajjad HiFriend:文件i/O没有那么复杂。您应该在
tableChanged
方法中创建新文件。迭代
表格模型的每个单元格
并检索值。将每个值添加到
StringBuilder
。在将单元格值添加到
StringBuffer
后,为每行添加
“\t”
StringBuffer
。读取一行后,将
“\n”
添加到
StringBuffer
。读取整个
后,使用FileWriter或
BufferedWriter将StringBuffer的内容写入文件