首页 文章

JTextField不会在keypress上更新

提问于
浏览
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;
}

}

1 回答

  • -1

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

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

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

    @Override
    public boolean stopCellEditing(){
            currentValue = textField.getText();
            return super.stopCellEditing();
    }
    

    希望这可以帮助任何有同样问题的人 .

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

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

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

相关问题