我有一个jtable,其中的一列绑定一个jcombox
当我选中第三行的jcombox(注意:是选中但不是下拉,仅仅是选中状态)删除该行完成的时候
第四行的jcombox发生了变化:值变为 刚刚删除的那一行的值,状态,也变为默认选中状态。
等于是第三行的已经被删除的jcombox原封不动的覆盖了第四行的Jcombox.
请各位老大解个惑。非常感谢!
本人分不多,就散10分吧!就算兄弟们帮帮忙吧!
当我选中第三行的jcombox(注意:是选中但不是下拉,仅仅是选中状态)删除该行完成的时候
第四行的jcombox发生了变化:值变为 刚刚删除的那一行的值,状态,也变为默认选中状态。
等于是第三行的已经被删除的jcombox原封不动的覆盖了第四行的Jcombox.
请各位老大解个惑。非常感谢!
本人分不多,就散10分吧!就算兄弟们帮帮忙吧!
我的jdk用的是1.4版本的。
//row:要删除的行的序号
model.removeRow(row)试试这样的
删除的代码,就是这些了:
private void delButtonActionPerformed(java.awt.event.ActionEvent e) { DefaultTableModel defaultModel = (DefaultTableModel) dataTable
.getModel(); int rowcount = defaultModel.getRowCount() - 1;
// getRowCount返回行数,rowcount<0代表已经没有任何行了。
if (index >= 0) {
// 删除行比较简单,根据选中行的索引用DefaultTableModel的removeRow()方法即可。
defaultModel.removeRow(index);
// 行完毕后必须重新设置列数,也就是使用DefaultTableModel的setRowCount()方法来设置。
defaultModel.setRowCount(rowcount); //Focus设置
if (dataTable.getRowCount()>index) {
dataTable.requestFocus(); //中间删除向下移动
dataTable.changeSelection(index, 0, false, false);
dataTable.editCellAt(index, 0, null);
} else{
dataTable.requestFocus(); //末尾删除向上移动
dataTable.changeSelection(dataTable.getRowCount()-1, 0, false, false);
dataTable.editCellAt(dataTable.getRowCount()-1, 0, null);
} index = -1; }
dataTable.revalidate();
}
defaultModel.removeRow(index); index的值是在new DefaultTableModel()的时候,在下面这个方法里赋值的:
public boolean isCellEditable(int rowIndex, int columnIndex) {
index = rowIndex;
if (InsureToolUtil.isFile(this, rowIndex) && columnIndex == 3) {
return false;
}
return canEdit[columnIndex];
}
这个地方判定所选择的行号。这个地方判定所选择的行号的原因
因为我们在 一个单元格里放了一个Jcombox,我出现了一个状况,就是 当我点击jcombox 而不是他所在的单元格的时候,有时候jcombox被选中却不能触发Jtable的事件
this.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
} public void mousePressed(java.awt.event.MouseEvent evt) {
tableDataMousePressed();//XXXXXX 这个方法不能被调用
}
});导致我不能获得当前的行号。 取了个巧就在判断单元格是否可以编辑的时候 获得了行号。
gongfuliang 兄弟的说法让我产生了点灵感
你的意思也就是说:
当我删除了之后,jcombox的焦点还没有消失,
所以根据我上面的程序,我删除了第三行之后,当Jcombox失去焦点的时候他仍然会在它默认的index上更新单元格的值。而这个时候DefaultTableModel已经自动地把下一行的值提前(Jcombox所记忆的)index上的数据已经发生了变化。
所以在删除之前,要转移该待删除行的jcombox的焦点。
基于这个理解,我做了以下测试:把//Focus设置
if (dataTable.getRowCount()>index) {
dataTable.requestFocus(); //中间删除向下移动
dataTable.changeSelection(index, 0, false, false);
dataTable.editCellAt(index, 0, null);
} else{
dataTable.requestFocus(); //末尾删除向上移动
dataTable.changeSelection(dataTable.getRowCount()-1, 0, false, false);
dataTable.editCellAt(dataTable.getRowCount()-1, 0, null);
} 移动至删除语句:// 删除行比较简单,根据选中行的索引用DefaultTableModel的removeRow()方法即可。
defaultModel.removeRow(index); 的前面。问题解决!
private void delButtonActionPerformed(java.awt.event.ActionEvent e) { DefaultTableModel defaultModel = (DefaultTableModel) dataTable
.getModel(); int rowcount = defaultModel.getRowCount() - 1;
// getRowCount返回行数,rowcount <0代表已经没有任何行了。
if (index >= 0) { //Focus设置
if (dataTable.getRowCount()>index) {
dataTable.requestFocus(); //中间删除向下移动
dataTable.changeSelection(index, 0, false, false);
dataTable.editCellAt(index, 0, null);
} else{
dataTable.requestFocus(); //末尾删除向上移动
dataTable.changeSelection(dataTable.getRowCount()-1, 0, false, false);
dataTable.editCellAt(dataTable.getRowCount()-1, 0, null);
} // 删除行比较简单,根据选中行的索引用DefaultTableModel的removeRow()方法即可。
defaultModel.removeRow(index);
// 行完毕后必须重新设置列数,也就是使用DefaultTableModel的setRowCount()方法来设置。
defaultModel.setRowCount(rowcount); index = -1; }
dataTable.revalidate();
} 顺便问一句,前面的代码中,当我点击到jcombox中,jcombox获得焦点,为什么不能触发那个jtable的事件呢?
期待有兄弟能够回答啊,呵呵。
期待有兄弟能够回答啊,呵呵。