如何使JTable单元默认为覆盖模式

时间:2010-10-29 15:21:20

标签: java jtable

双击单元格时,默认情况下JTable单元格处于追加模式。 有没有办法让单元格默认为覆盖模式,IOW,选择单元格的内容,这样如果用户开始输入旧文本将被新文本替换,而不必手动擦除它?

3 个答案:

答案 0 :(得分:4)

您应该可以通过创建自己的TableCellEditor来执行此操作,可以使用setCellEditor()将其分配给父表。该对象是JTable在用户开始编辑单元格时调用的工厂,用于创建用于执行实际编辑的字段。您可以返回自己的JTextField,只需避免设置旧值即可实现您的要求。您还必须在文本字段中附加一个侦听器,以便在用户输入完成后更新表中的值。

答案 1 :(得分:3)

您可能会发现Table Select All Editor有帮助。

答案 2 :(得分:2)

我已经实现了以下方法[addDeletePreviousOnEditBehavior],工作正常!请注意,您需要使用一些TableCellEditor。为此,请添加以下代码:

JTable table=new JTable();
JTextField field=new JTextField();
addDeletePreviousOnEditBehavior(field);
table.setCellEditor(new DefaultCellEditor(field));

方法是:

public static void addDeletePreviousOnEditBehavior(final JComponent field) {

    field.addFocusListener(new FocusListener() {

        @Override
        public void focusGained(FocusEvent fe) {
            field.putClientProperty(DELETE_ON_EDIT, true);
        }

        @Override
        public void focusLost(FocusEvent fe) {
        }
    });

    field.addKeyListener(new KeyListener() {

        @Override
        public void keyTyped(KeyEvent ke) {
        }

        @Override
        public void keyPressed(KeyEvent ke) {
            if ((!(ke.isActionKey()
                    || isSpecial(ke.getKeyCode())))
                    && ((Boolean) field.getClientProperty(DELETE_ON_EDIT))) {
                System.out.println("Key:" + ke.getKeyCode() + "/" + ke.getKeyChar());
                field.putClientProperty(DELETE_ON_EDIT, false);
                if (field instanceof JFormattedTextField) {
                    ((JFormattedTextField) field).setValue(null);
                }
                if (field instanceof JTextComponent) {
                    ((JTextComponent) field).setText(null);
                }

            }
        }

        @Override
        public void keyReleased(KeyEvent ke) {
           // do nothing
        }
    });
}