java - 如何在编辑时选择 JTable 单元格中的所有文本但在键入时不选择?

标签 java swing jtable

JTable 的默认行为是在您开始键入时追加到内容上,并在单击时将插入符号放在单击的位置。我希望这两个东西的行为都发生变化,所以当我编辑一个单元格时,内容会被替换,无论是通过键入还是通过单击然后键入。但是,当我单击一个单元格然后更改插入符号位置时,我希望保留内容以便我可以更改它。

我知道如何在单元格开始编辑时全选,方法是将单元格编辑器替换为在 SwingUtilities.invokeLater 中全选的单元格编辑器(请参阅 elsewhere ),但这会导致打字行为中断。当我这样做并开始在单元格中键入时,首先键入的字符附加到字符串,然后它被选中(但选择是不可见的!),当键入另一个字符时,内容将被替换。

有没有一种方法可以在突出显示(但不编辑)的单元格中键入时立即替换内容,但在单击单元格时全选?

这是我用于 CellEditor 的代码:

public class TextFieldCellEditor extends JTextField implements TableCellEditor
{
    private CellEditorListener  cellEditorListener  = null;

    private boolean             isInteger           = false;
    private Object              oldValue;

    // Start editing
    @Override
    public Component getTableCellEditorComponent(JTable table, Object obj, boolean isSelected, int row, int column)
    {
        Color color2 = DefaultLookup.getColor(this, ui, "Table.alternateRowColor");
        super.setBackground(color2 != null && (row & 1) == 1? color2 : table.getBackground());
        super.setForeground(table.getForeground());
        super.setBorder(DefaultLookup.getBorder(this, ui, "Table.focusCellHighlightBorder"));

        super.setText(obj.toString());

        isInteger = obj instanceof Integer;
        if (isInteger)
        {
            super.setHorizontalAlignment(SwingConstants.RIGHT);
            oldValue = obj;
        }

        // SwingUtilities.invokeLater(new Runnable()
        // {
        // public void run()
        // {
        // TextFieldCellEditor.this.selectAll();
        // }
        // });

        return this;
    }

    // Retrieve e dited value
    @Override
    public Object getCellEditorValue()
    {
        if (isInteger)
        {
            // Try to convert to integer. If input is invalid, revert.
            try
            {
                return new Integer(super.getText());
            }
            catch (NumberFormatException e)
            {
                return oldValue;
            }
        }
        return super.getText();
    }

    @Override
    public boolean isCellEditable(EventObject e)
    {
        return true;
    }

    @Override
    public boolean shouldSelectCell(EventObject e)
    {
        return true;
    }

    @Override
    public boolean stopCellEditing()
    {
        cellEditorListener.editingStopped(new ChangeEvent(this));
        return true;
    }

    @Override
    public void cancelCellEditing()
    {
        cellEditorListener.editingCanceled(new ChangeEvent(this));
    }

    @Override
    public void addCellEditorListener(CellEditorListener celleditorlistener)
    {
        cellEditorListener = celleditorlistener;
    }

    @Override
    public void removeCellEditorListener(CellEditorListener celleditorlistener)
    {
        if (cellEditorListener == cellEditorListener) cellEditorListener = null;
    }
}

最佳答案

在您的 getTableCellEditorComponent() 实现中,添加以下内容:

if (isSelected) {
    this.selectAll();
}

顺便说一句,为什么不扩展 AbstractCellEditorDefaultCellEditor(JTextField textField)?另见 How to Use Tables: Using Other Editors .

附录:另见 Table Select All RendererTable Select All Editor .

关于java - 如何在编辑时选择 JTable 单元格中的所有文本但在键入时不选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8171460/

相关文章:

java - 独立 Java EE JAR 文件的直接链接是什么?

java - java swing 中的 Hibernate 和库 sql cp30

Java 文本字段十进制验证

java.io.NotSerializedException : java. lang.reflect.Constructor

java - BufferedImage.getGraphics().drawImage() 改变像素值

java - SQL 替换与执行插入或更新语句

java - JTable 行背景颜色对于 Double 或 Integer 没有改变

java - 我无法相对于 jtable 列设置我的选择器

javadoc @global 或 @memberAttribute

java - 在不单击列标题的情况下对 JTable 的条目进行排序