我有一个有 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));
}
}
});
在我的按钮中,我循环浏览列表并检索行、列和文本并将密码设置为 SHA256 到 JTable。
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。
解决方案是在操作侦听器的开头单击按钮时删除 TableModelListener。然后,您需要在代码末尾将 TableModelListener 添加回 TableModel,以防用户进行进一步的更改。
另一种解决方案是在表模型中有 3 列、用户名、密码和 sha256Password。然后,您可以使用 JTable 仅显示前两列。请参阅 JTable 的removeColumn()
方法。然后,您的转化代码将使用以下内容更新表格模型:
table.getModel().setValueAt(value, row, 2);
现在,将调用 TableModel 中的代码,但由于您检查了对第 1 列的更新,因此更新第 2 列时不会发生任何操作。
然后,当您保存数据时,您保存了表模型中的数据。
编辑:
我必须先单击另一个单元格,然后才能按下按钮进行编辑。
您需要停止单元格编辑。有关几个解决方案,请参阅表停止编辑。