我有一个使用自定义TableModel的JTable。我扩展了AbstractCellEditor类,当我双击文本字段时,单元格正确显示输入到文本字段的文本。但是当我只是单击选择表格中的单元格并开始键入时,文本字段会收到文本,但是当我按Enter键时,它不会更新文本字段。我将一个焦点监听器附加到文本字段进行故障排除,并发现当我双击字段时它只会获得并失去焦点。单击它就不会获得焦点(即使它允许我编辑它)。这令我难以置信!我尝试了textField.grabFocus()
,textField.requestFocusInWindow()
以及各种其他事情。有什么建议?谢谢!
public class IndexerCellEditor extends AbstractCellEditor implements
TableCellEditor {
private JTextField textField;
private RecordValue currentValue;
public IndexerCellEditor(){
textField = new JTextField();
}
@Override
public boolean isCellEditable(EventObject e){
if(e instanceof MouseEvent){
return ((MouseEvent)e).getClickCount() >= 2;
}
return true;
}
@Override
public Object getCellEditorValue() {
return currentValue;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
textField.setBorder(BorderFactory.createLineBorder(Color.black, 1));
currentValue = (RecordValue) value;
textField.setText(currentValue.getValue());
textField.addFocusListener(new FocusListener(){
@Override
public void focusGained(FocusEvent e) {
System.out.println("focus gained");
}
@Override
public void focusLost(FocusEvent e) {
System.out.println("focus lost");
}
});
textField.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
currentValue.setValue(((JTextField)e.getSource()).getText());
fireEditingStopped();
}
});
return textField;
}
}
答案 0 :(得分:-1)
好的,所以经过大约8个小时的撞击墙头后,我发现了两件事:
我在jtextfield上不需要动作监听器,因为JTable会为我处理这个问题。当我双击+键入后点击enter
或单击+键入时,JTable会自动调用stopCellEditing()
,这会将我带到
我需要在IndexerCellEditor类中覆盖stopCellEditing()
以保存JTextField文本,然后再将其传递给父级。我失踪的代码:
@Override
public boolean stopCellEditing(){
currentValue = textField.getText();
return super.stopCellEditing();
}
希望这可以帮助任何有同样问题的人。
修改强>
这适用于我的情况,因为我还扩展了DefaultTableModel
,它负责通过方法通知听众:
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
cells[rowIndex][columnIndex] = (String) aValue;
fireTableCellUpdated(rowIndex, columnIndex);
}
我通过使用相同的扩展DefaultTableModel
构建两个不同的表来进行更多测试。将它们并排放置在JPanel
中,我可以在一个表中编辑一个单元格,按下回车键,它将更新已编辑的单元格和另一个表格中的对应单元格。简而言之,需要在项目的某个地方通过fire...
方法调用来通知听众。