How to do JTable on cellchange select all text

落爺英雄遲暮 提交于 2019-12-01 18:31:27
trashgod

regarding editorComponent, where do I initialize this variable?

The variable editorComponent is a field of DefaultCellEditor.

Instead of

class CellEditor extends JTextField implements TableCellEditor

consider

class CellEditor extends DefaultCellEditor

Then you can do something like this:

@Override
public Component getTableCellEditorComponent(JTable table,
        Object value, boolean isSelected, int row, int column) {
    JTextField ec = (JTextField) editorComponent;
    if (isSelected) {
        ec.selectAll();
    }
    return editorComponent;
}

Addendum: As suggested by @Edoz and illustrated in this complete example, you can selectively re-queue the selectAll() when a mouse-click initiates editing.

JTable table = new JTable(model) {

    @Override // Always selectAll()
    public boolean editCellAt(int row, int column, EventObject e) {
        boolean result = super.editCellAt(row, column, e);
        final Component editor = getEditorComponent();
        if (editor == null || !(editor instanceof JTextComponent)) {
            return result;
        }
        if (e instanceof MouseEvent) {
            EventQueue.invokeLater(() -> {
                ((JTextComponent) editor).selectAll();
            });
        } else {
            ((JTextComponent) editor).selectAll();
        }
        return result;
    }
};

What i want to do is on cell change (focus), the next selected cell will have all the text selected, ready for user to totally change it..

The solution depends on your exact requiement. A JTable has a renderer and an editor.

A render generally just shows the text in the cell. If you want the text replaced when you start typing then you need to do two things:

a) change the renderer to display the text in a "selected" state so the user knows that typing a character will remove the existing text b) change the editor to select all the text when it is invoked

This approach is relatively difficult because you will need a custom renderer for each different data type in your table (ie. String, Integer).

Or another approach is to automatically place each cell in editing mode when it gets focus and therefore you only need to change the editor to select the text.

This approach is easy as you can just do:

JTable table = new JTable(data, columnNames)
{
    //  Place cell in edit mode when it 'gains focus'

    public void changeSelection(
        int row, int column, boolean toggle, boolean extend)
    {
        super.changeSelection(row, column, toggle, extend);

        if (editCellAt(row, column))
        {
            Component editor = getEditorComponent();
            editor.requestFocusInWindow();
            ((JTextComponent)editor).selectAll();
        }
    }
};
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!