JTable获取正在编辑的所有行

时间:2014-08-18 17:34:39

标签: java swing jtable

我有一个有两列的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 ..我有一个List来存储文本以及行和列 表格改变后

 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);
                }
            }
        }
    }); 

我得到的结果是我会在我的控制台中无休止地打印密码。 所以我认为我的逻辑是错误的,需要纠正。

1 个答案:

答案 0 :(得分:1)

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保存数据。

编辑:

  

在按下我的按钮进行编辑之前,我必须先点击进入另一个单元格。

您需要停止单元格编辑。有关几种解决方案,请参阅Table Stop Editing