0

我有一个使用自定义 TableModel 的 JTable。我扩展了 AbstractCellEditor 类,当我双击文本字段时,单元格正确显示了输入到文本字段中的文本。但是当我单击选择表格中的单元格并开始输入时,文本字段会收到文本,但是当我按下回车键时,它不会更新文本字段。我在文本字段上附加了一个焦点侦听器以进行故障排除,发现当我双击该字段时它只会获得和失去焦点。通过单击它不会获得焦点(即使它允许我编辑它)。这让我大吃一惊!我已经尝试过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;
}

}
4

1 回答 1

-1

好吧,在我的头撞到墙上大约 8 个小时之后,我发现了 2 件事:

  1. 我不需要 jtextfield 上的动作侦听器,因为 JTable 会为我处理这些。当我enter双击+打字或单击+打字后点击时,JTable会自动调用stopCellEditing(),这让我

  2. 我需要stopCellEditing()在我的 IndexerCellEditor 类中覆盖以保存 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。将它们并排放置在 a 中JPanel,我可以编辑一个表中的一个单元格,然后按 Enter 键,它将同时更新已编辑的单元格及其在另一个表中的对应单元格。简而言之,侦听器确实需要通过fire...项目中某处的方法调用来通知。

于 2013-08-10T21:40:18.563 回答