先描述一下我遇到的具体场景
我这里是需要在JTable中输入某个值并且输入了enter之后,在JTable外面JLabel同步显示刚刚输入的值。
这一部分,参考了博客:
https://blog.csdn.net/m0_37550986/article/details/81090426
不过这里有个问题就是,在你输入Enter的时候,表格没有结束编辑,也就是说你刚刚输入的数据并没有写到表格里面去,你可以获取到行号,但是你不能根据行号获取还未输入完毕的值。
这里百度到了一个很好的解法:
https://zhidao.baidu.com/question/99876251.html
/*************************此处为复制内容**********************/
应该有两种情况:
第一 如果你的光标还停留在那个单元格,这时候JTable默认该单元格还没有结束编辑,不会保存当前的值。
第二 如果你的光标不在那个单元格了,这时候JTable应该会认为单元格已经结束编辑,所以会读取编辑后的值。
根据你的描述,你应该是第一种操作,那么你可在点击那个按钮的时候,强制Jtable结束编辑状态,一般可以通过jTable.getCellEditor().stopCellEditing()来实现,但是如果你的单元格设置默认的编辑器的话,就需要通过jTable1.getCellEditor(row,column).stopCellEditing()来实现。
下面是我对上面需求做的代码。
tableTaskTest.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
if(tableTaskTest.isEditing()) {
tableTaskTest.getEditorComponent().addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
int nEditRow = tableTaskTest.getEditingRow();
int nEditColumn = tableTaskTest.getEditingColumn();
if(tableTaskTest.getCellEditor() == null)return;
tableTaskTest.getCellEditor().stopCellEditing();
String strSelectedTestTaskName = (String) tableTaskTest.getValueAt(nEditRow, nEditColumn);
lblSelectedTestTaskName.setText(strSelectedTestTaskName);
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
});
}
}
});