Jtable updates the selected row

I have a jtable that has an edit button, when I select a row and click the "Edit" button and edit the fields and click the "Save" button, this row is not updated. And I need to update the table to change this row!

My code is:

if (e.getSource() == editButton) { selectedRow = uTable.getSelectedRow(); if (selectedRow >= 0) { editUser(selectedRow); } else { JOptionPane.showMessageDialog(null, "Select a row"); } } public void editUser(int row) { UserInformation userInf = userModel.getSelectedMember(row); NewUserFrame_Edit edit = new NewUserFrame_Edit(userInf, row); } ... 

My NewUserFrame_Edit Class:

 public class NewUserFrame_Edit extends javax.swing.JFrame { private AllUser userModel; private int selectedrow; private String gender; 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); } private void updateButtonActionPerformed(java.awt.event.ActionEvent evt) { userinf = new UserInformation(); userinf.setFname(jTextField1.getText()); userinf.setLname(jTextField2.getText()); userinf.setGender(gender); userinf.setDate(jTextField3.getText()); userModel.setValueAt(userinf.getFname() , selectedrow, 1); userModel.setValueAt(userinf.getLname() , selectedrow, 2); userModel.setValueAt(userinf.getGender(), selectedrow , 3); userModel.setValueAt(userinf.getDate() , selectedrow, 4); userModel.updateFile(userModel.Udata); NewUserFrame_Edit.this.dispose(); } ... } 

My methods setValueAt () and updateFile () of my model Class:

 public class AllUser extends AbstractTableModel { ... @Override public void setValueAt(Object value, int rowIndex, int columnIndex) { UserInformation userInfo = Udata.get(rowIndex); switch (columnIndex) { case 0: userInfo.setID((String) value); break; case 1: userInfo.setFname((String) value); break; case 2: userInfo.setLname((String) value); break; case 3: userInfo.setGender((String) value); break; case 4: userInfo.setDate((String) value); break; } fireTableCellUpdated(rowIndex, columnIndex); } 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) { } } ... } 

When I select a row and click on the "Edit" button, a new jframe opens, in which its text box is filled with older data, and I update the data and click the "Save" button. So my column is not defined. I select the whole row, not the cell!

Thanks.

+4
source share
3 answers

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 row } } } private class MyModel extends AbstractTableModel { String[] columns = { "Roll No.", "Name", "Action" }; String[][] inData = { {"1","Anthony Hopkins","Edit"}, {"2","James William","Edit"}, {"3","Mc. Donald","Edit"} }; @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; } //This method updates the Row of table public void updateRow(int index,String[] values) { for (int i = 0 ; i < values.length ; i++) { setValueAt(values[i],index,i); } } } public static void main(String st[]) { SwingUtilities.invokeLater( new Runnable() { @Override public void run() { TableRowEdit td = new TableRowEdit(); td.prepareAndShowGUI(); } }); } } 

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/*Add this parameter*/,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) { //userModel = new AllUser();//Comment it. userinf = new UserInformation(); userinf.setFname(jTextField1.getText()); userinf.setLname(jTextField2.getText()); userinf.setGender(gender); userinf.setDate(jTextField3.getText()); userModel.setValueAt(userinf.getFname() , selectedrow, 1); userModel.setValueAt(userinf.getLname() , selectedrow, 2); userModel.setValueAt(userinf.getGender(), selectedrow , 3); userModel.setValueAt(userinf.getDate() , selectedrow, 4); userModel.updateFile(userModel.Udata); NewUserFrame_Edit.this.dispose(); } 

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) { } } 
+4
source

To modify JTable entries JTable use TableModel # setValueAt . The fireTableDataChanged call fireTableDataChanged not needed. This is used internally for use inside the TableModel .

 if (selectedRow >= 0) { ... userModel.setValueAt(newValue, selectedRow, 0); // ... more values for columns 1, 2, 3, etc. } ... 
+5
source

Another way to implement changes through JTable is to use the code template below:

  table.getModel().addTableModelListener(new TableModelListener(){ /** * Called when table has been changed. */ @Override public void tableChanged(TableModelEvent e) { int row = e.getFirstRow(); int column = e.getColumn(); TableModel model = (TableModel) e.getSource(); String newdata = (String) model.getValueAt(row, column); model.setValueAt(newdata, row, column); // do your update with the newdata variable. } }); 

Here you can use the actual event to get the row and column of the cell that was changed in the JTable variable.

+2
source

All Articles