You can create a method called updateRow(int index,String[] values) in your extensible AbstractModel class and set a new value for each cell for this row using setValueAt (newValue, row, index). And in the redefined setValue method write fireTableCellUpdated (string, col).
Consider the code below. Take a look at the updateRow and setValueAt in the MyModel class. And see ((MyModel)myModel).updateRow(row,values);//update row , written in the MyMouseAdapter class.
import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; import javax.swing.table.*; class TableRowEdit extends JFrame { private JTable table; private JScrollPane jsPane; private TableModel myModel; private JPanel dialogPanel; private JTextField tf[]; private JLabel lbl[]; public void prepareAndShowGUI() { myModel = new MyModel(); table = new JTable(myModel); jsPane = new JScrollPane(table); table.getColumnModel().getColumn(2).setCellRenderer(new LabelCellRenderer()); table.addMouseListener(new MyMouseAdapter()); getContentPane().add(jsPane); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); prepareDialogPanel(); pack(); setVisible(true); } private void prepareDialogPanel() { dialogPanel = new JPanel(); int col = table.getColumnCount() - 1; dialogPanel.setLayout(new GridLayout(col,2)); tf = new JTextField[col]; lbl = new JLabel[col]; for (int i = 0; i < col; i++) { lbl[i] = new JLabel(table.getColumnName(i)); tf[i] = new JTextField(10); dialogPanel.add(lbl[i]); dialogPanel.add(tf[i]); } } private void populateTextField(String[] s) { for (int i = 0 ; i < s.length ; i++ ) { tf[i].setText(s[i]); } } public class LabelCellRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table,Object oValue, boolean isSelected, boolean hasFocus, int row, int column) { Component c = super.getTableCellRendererComponent(table, oValue,isSelected, hasFocus,row, column); String value = (String)oValue; JLabel label =(JLabel)c; label.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); label.setBackground(Color.lightGray); label.setHorizontalTextPosition(SwingUtilities.CENTER); label.setHorizontalAlignment(SwingUtilities.CENTER); label.setText(value); return label; } } private class MyMouseAdapter extends MouseAdapter { @Override public void mousePressed(MouseEvent evt) { int x = evt.getX(); int y = evt.getY(); int row = table.rowAtPoint(new Point(x,y)); int col = table.columnAtPoint(new Point(x,y)); if (col == 2) { String arr[] = new String[table.getColumnCount() - 1]; for (int i = 0 ; i < arr.length ; i++) { arr[i] = (String)table.getValueAt(row,i); } populateTextField(arr); JOptionPane.showMessageDialog(TableRowEdit.this,dialogPanel,"Information",JOptionPane.INFORMATION_MESSAGE); String[] values = new String[tf.length]; for (int i = 0 ; i < tf.length ; i++) { values[i] = tf[i].getText(); } ((MyModel)myModel).updateRow(row,values);
UPDATE
Everything was fine with your source code. Save the code as it was originally. The only problem was the line userModel = new AllUser(); in the updateButtonActionPerformed method. He created a new AllUser object instead of using the current one. Therefore, you should remove this line from updateButtonActionPerformed . and change the constructor of NewUserFrame_Edit as follows:
public NewUserFrame_Edit(AllUser userModel,UserInformation userinf, int row) { ... this.userModel = userModel; jTextField1.setText(userinf.getFname().toString().trim()); jTextField2.setText(userinf.getLname().toString().trim()); if (userinf.getGender().equals("Male")) { jRadioButton1.setSelected(true); } else { jRadioButton2.setSelected(true); } jTextField3.setText(userinf.getDate()); selectedrow = row; setVisible(true); }
change your value as updateButtonActionPerformed :
private void updateButtonActionPerformed(java.awt.event.ActionEvent evt) {
And change the editUser(int row) method of the editUser(int row) class as follows:
public void editUser(int row) { UserInformation userInf = userModel.getSelectedMember(row); NewUserFrame_Edit edit = new NewUserFrame_Edit(userModel,userInf, row); }
Here is your updateFile metd:
public void updateFile(ArrayList<UserInformation> data) { PrintWriter pw; try { pw = new PrintWriter(new FileWriter("AllUserRecords.txt")); for (UserInformation userinf : data) { String line = userinf.getID() + " " + userinf.getFname() + " " + userinf.getLname() + " " + userinf.getGender() + " " + userinf.getDate(); pw.println(line); } pw.close(); } catch (IOException ioe) { } }