根据其他单元格值修改一些 jtable 单元格值
Modify some jtable cell values based on other cell values
我有一个 jtable,带有 editable 和非 editable 单元格。
我想根据 editable 单元格和一些公式修改非 editable 单元格。
我尝试了以下方法:
int input_column = 0;
int output_column = 5;
table.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
int rowIndex = pricestable.getSelectedRow();
int columnIndex = pricestable.getSelectedColumn();
if (columnIndex == input_column) {
String value1 = table.getModel().getValueAt(rowIndex, input_column).toString();
//do some operations with value1 convert, it to outputvalue
table.setValueAt(outputvalue, rowIndex, output_column);
}
}
});
问题是,tablechanged 事件将被递归调用...
有谁知道我做错了什么,或者有更好的解决方案吗?
我见过一些覆盖 setValueAt() 方法的解决方案,
但有时我需要使用两个输入单元格的组合值来生成输出单元格值,我可以在填充 table 后添加此侦听器,但如果覆盖 setValueAt() 则无法执行此操作。 ..
我有一个简单的解决方案来克服递归调用。 addTableListener
不会对将由您的程序更改的列感兴趣。
'colDirty' 是宽度为 0px 的列;
示例代码:
private void addTableListener() {
tableModel.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent tme) {
if (tme.getType() == TableModelEvent.UPDATE) {
if (tme.getColumn()!=colDirty) { // colDirty = column no which I changed value programatically
tableModel.setValueAt(true, tme.getFirstRow(), colDirty);
}
}
}
});
}
我有一个 jtable,带有 editable 和非 editable 单元格。 我想根据 editable 单元格和一些公式修改非 editable 单元格。
我尝试了以下方法:
int input_column = 0;
int output_column = 5;
table.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
int rowIndex = pricestable.getSelectedRow();
int columnIndex = pricestable.getSelectedColumn();
if (columnIndex == input_column) {
String value1 = table.getModel().getValueAt(rowIndex, input_column).toString();
//do some operations with value1 convert, it to outputvalue
table.setValueAt(outputvalue, rowIndex, output_column);
}
}
});
问题是,tablechanged 事件将被递归调用... 有谁知道我做错了什么,或者有更好的解决方案吗?
我见过一些覆盖 setValueAt() 方法的解决方案, 但有时我需要使用两个输入单元格的组合值来生成输出单元格值,我可以在填充 table 后添加此侦听器,但如果覆盖 setValueAt() 则无法执行此操作。 ..
我有一个简单的解决方案来克服递归调用。 addTableListener
不会对将由您的程序更改的列感兴趣。
'colDirty' 是宽度为 0px 的列;
示例代码:
private void addTableListener() {
tableModel.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent tme) {
if (tme.getType() == TableModelEvent.UPDATE) {
if (tme.getColumn()!=colDirty) { // colDirty = column no which I changed value programatically
tableModel.setValueAt(true, tme.getFirstRow(), colDirty);
}
}
}
});
}