我有一个有 2 列的 JTable
- 第 0 列用户名
- 第 1 列密码。
对于密码列,它将被加密为 SHA256。
基本上我想要实现的是将我的密码列中的所有行更新为我在按下按钮后编辑的 SHA256。
所以..
我有一个 RowData 类,它将存储正在编辑的文本和文本的位置 正在编辑(行,列)。
public class RowData {
int rows = 0, columns = 0;
String text = " ";
public RowData(String text,int rows, int columns) {
setEditedRows(rows);
setEditedColumns(columns);
setEditedText(text);
}
public int getEditedRows() {
return rows;
}
public int getEditedColumns() {
return columns;
}
public String getEditedText() {
return text;
}
public void setEditedRows(int rows) {
this.rows = rows;
}
public void setEditedColumns(int columns) {
this.columns = columns;
}
public void setEditedText(String text) {
this.text = text;
}
}
我写了一个TableModelListener..我有一个列表来存储文本以及行和列 表格更改后
table.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
TableModel model = (TableModel) e.getSource();
//System.out.println(model.getValueAt(row, column));
if(column == 1) {
String data = (String) model.getValueAt(row, column);
System.out.println(data);
dataList.add(new RowData(data,row,column));
}
}
});
在我的按钮中,我循环遍历列表并检索行、列和文本 并将JTable的密码设置为SHA256。
updateBtn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if (table.getCellEditor() != null) {
table.getCellEditor().stopCellEditing();
for(int i = 0; i < dataList.size(); i++) {
String text = dataList.get(i).getEditedText();
int rows = dataList.get(i).getEditedRows();
int columns = dataList.get(i).getEditedColumns();
//System.out.println(dataList.get(i).getEditedText() + " " + dataList.get(i).getEditedRows() + dataList.get(i).getEditedColumns());
table.setValueAt(convertPassword.convertToSHA256(text), rows ,columns);
}
}
}
});
我得到的结果是我将继续在控制台中无休止地打印密码。 所以我认为我的逻辑是错误的,需要纠正。
最佳答案
table.setValueAt(convertPassword.convertToSHA256(text), rows ,columns);
当您更改 TableModel 时,TableModelListener 将再次被调用。无论您是使用 JTable 还是直接更新 TableModel 更改数据,都会调用 TableModelListener。
解决方案是在您单击 ActionListener 开始处的按钮时删除 TableModelListener。然后,您需要在代码末尾将 TableModelListener 添加回 TableModel,以防用户进行进一步更改。
另一个解决方案是在 TableModel 中包含 3 列:用户名、密码和 sha256Password。然后您可以使用 JTable 仅显示前两列。请参阅 JTable 的 removeColumn()
方法。然后您的转换代码将使用以下方法更新 TableModel:
table.getModel().setValueAt(value, row, 2);
现在将调用 TableModel 中的代码,但由于您检查第 1 列的更新,因此更新第 2 列时不会发生任何事情。
然后,当您保存数据时,您会保存 TableModel 中的数据。
编辑:
I must click into another cell before I can press my button to edit.
您需要停止单元格编辑。请参阅Table Stop Editing一些解决方案。
关于java - JTable 获取所有正在编辑的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25368933/