JTextField不会在keypress上更新

时间:2013-08-10 18:08:21

标签: java swing jtable jtextfield tablecelleditor

我有一个使用自定义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;
}

}

1 个答案:

答案 0 :(得分:-1)

好的,所以经过大约8个小时的撞击墙头后,我发现了两件事:

  1. 我在jtextfield上不需要动作监听器,因为JTable会为我处理这个问题。当我双击+键入后点击enter或单击+键入时,JTable会自动调用stopCellEditing(),这会将我带到

  2. 我需要在IndexerCellEditor类中覆盖stopCellEditing()以保存JTextField文本,然后再将其传递给父级。我失踪的代码:

    @Override
    public boolean stopCellEditing(){
            currentValue = textField.getText();
            return super.stopCellEditing();
    }
    
  3. 希望这可以帮助任何有同样问题的人。

    修改 这适用于我的情况,因为我还扩展了DefaultTableModel,它负责通过方法通知听众:

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        cells[rowIndex][columnIndex] = (String) aValue;
        fireTableCellUpdated(rowIndex, columnIndex);
    }
    

    我通过使用相同的扩展DefaultTableModel构建两个不同的表来进行更多测试。将它们并排放置在JPanel中,我可以在一个表中编辑一个单元格,按下回车键,它将更新已编辑的单元格和另一个表格中的对应单元格。简而言之,需要在项目的某个地方通过fire...方法调用来通知听众。