Эффект изменения значения ячейки JTable в текстовом файле

Я использую этот метод для изменения значения ячейки таблицы, оно изменяется в 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);
    }
    }

Второй класс:

public class user_AllBooksM extends JFrame implements ActionListener {

    user_AllBooks uAllBooks = new user_AllBooks();
    final JTable bTable = new JTable(uAllBooks);
    JButton borrowButton;

    public user_AllBooksM() {
        setTitle("All Books");
        exitButton = new JButton("Exit");
        borrowButton = new JButton("Borrow");
        borrowButton.addActionListener(this);
        JPanel Bpanel = new JPanel();
        Bpanel.setLayout(new FlowLayout());
        JScrollPane sp = new JScrollPane(bTable);
        Bpanel.add(sp);
        Bpanel.add(borrowButton);
        this.add(Bpanel);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds(300, 60, 550, 550);
        this.setResizable(false);
        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent event) {
        borrowInitialize(bTable.getSelectedRow());
    }

    public void borrowInitialize(int row) {
        if (uAllBooks.getValueAt(row, 3).equals("yes")) {
            JOptionPane.showMessageDialog(null, "This Book Was Borrowed");
        } else {
            uAllBooks.setValueAt("Yes", row, 3);
            uAllBooks.fireTableRowsUpdated(row, row);
        }
    }

    public static void main(String[] args) {
        new user_AllBooksM();
    }
}

Мой текстовый файл:

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

person Sajad    schedule 12.02.2013    source источник
comment
Измените свой вопрос, включив в него sscce, который включает образцы данных, исключает ложные сведения и показывает, как вы пишете в файл. ; не глотать исключения.   -  person trashgod    schedule 12.02.2013
comment
@trashgod Я добавляю текстовый файл...   -  person Sajad    schedule 13.02.2013
comment
Я добавляю метод setValueAt...   -  person Sajad    schedule 13.02.2013


Ответы (2)


Чтобы изменить содержимое файла при изменении значения ячейки, вы должны зарегистрировать 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();
            }
        });
    }
}
person Vishal K    schedule 13.02.2013
comment
Можете ли вы написать мой метод записи в файл? - person Sajad; 13.02.2013
comment
Что нужно записать в файл? - person Sajad; 13.02.2013
comment
Должен ли я писать в файл строку или значение ячейки? - person Sajad; 13.02.2013
comment
Каждая строка в моей строке таблицы имеет 4 элемента. - person Sajad; 13.02.2013
comment
@Sajjad-HiFriend: файловый ввод-вывод не так уж и сложен. Вы должны создать новый файл в методе tableChanged. Перебрать каждую ячейку tablemodel и получить значение. Добавьте каждое значение в StringBuilder. Для каждой строки после добавления значения ячейки в StringBuffer добавьте "\t" к StringBuffer . И после того, как строка будет прочитана, добавьте "\n" к StringBuffer. После того, как весь table будет прочитан, запишите содержимое StringBuffer в файл с помощью FileWriter или BufferedWriter - person Vishal K; 13.02.2013
comment
Щелкните это руководство для файлового ввода-вывода docs.oracle.com/javase/ tutorial/essential/io/charstreams.html - person Vishal K; 13.02.2013

Добавьте TableModelListener в вашу TableModel. Затем всякий раз, когда происходит первое событие обновления, вам нужно будет пройтись по строке/столбцам вашей TableModel и воссоздать текстовый файл.

Ваша TableModel реализована неправильно. Вы не реализовали метод setValueAt(...).

Метод «fireTableRowsUpdated()» следует вызывать из метода setValueAt() вашей TableModel. Его не следует вызывать из кода ActionListener.

person camickr    schedule 12.02.2013
comment
Можете ли вы объяснить мне больше и написать для меня этот TableModelListener? - person Sajad; 13.02.2013
comment
@Sajjad-HiFriend: Найдите java tutorial tablemodellistener. - person trashgod; 13.02.2013
comment
@Sajjad-HiFriend Вам нужно взглянуть на Как использовать таблицы< /а> - person MadProgrammer; 13.02.2013