JTable 获取正在编辑的所有行



我有一个有 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 列时不会发生任何操作。

然后,当您保存数据时,您保存了表模型中的数据。

编辑:

我必须先单击另一个单元格,然后才能按下按钮进行编辑。

您需要停止单元格编辑。有关几个解决方案,请参阅表停止编辑。