Как сделать JTable на cellchange выделить весь текст

Я видел какой-то пример этого, но до сих пор не могу понять и не могу его реализовать.

То, что я хочу сделать, - это изменение ячейки (фокус), в следующей выбранной ячейке будет выделен весь текст, готовый для того, чтобы пользователь полностью изменил его.

Есть идеи как это сделать?

// обновить // каким-то образом мне удалось выпустить следующий класс, но

реализовать это
tblLayers.setDefaultEditor(String.class, new Classes.CellEditor());

ничего не дает, "пока не поддерживается". НЕ брошен..

как мне решить эту проблему?

import java.awt.Component;
import java.util.EventObject;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;


public class CellEditor extends JTextField implements TableCellEditor {


public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    //        final JTextField ec = (JTextField) editorComponent;
    //
    //        ec.setText((String) value);
    //
    //        // selectAll, so that whatever the user types replaces what we just put there
    //        ec.selectAll();
    //
    //        SwingUtilities.invokeLater(new Runnable() {
    //
    //            public void run() {
    //                // make the component take the keyboard focus, so the backspace key works
    //                ec.requestFocus();
    //
    //                SwingUtilities.invokeLater(new Runnable() {
    //
    //                    public void run() {
    //                        // at this point the user has typed something into the cell and we
    //                        // want the caret to be AFTER that character, so that the next one
    //                        // comes in on the RHS
    //                        ec.setCaretPosition(ec.getText().length());
    //                    }
    //                });
    //            }
    //        });
    //        return editorComponent;


    throw new UnsupportedOperationException("Not supported yet.");
}

public Object getCellEditorValue() {
    throw new UnsupportedOperationException("Not supported yet.");
}

public boolean isCellEditable(EventObject anEvent) {
    throw new UnsupportedOperationException("Not supported yet.");
}

public boolean shouldSelectCell(EventObject anEvent) {
    throw new UnsupportedOperationException("Not supported yet.");
}

public boolean stopCellEditing() {
    throw new UnsupportedOperationException("Not supported yet.");
}

public void cancelCellEditing() {
    throw new UnsupportedOperationException("Not supported yet.");
}

public void addCellEditorListener(CellEditorListener l) {
    throw new UnsupportedOperationException("Not supported yet.");
}

public void removeCellEditorListener(CellEditorListener l) {
    throw new UnsupportedOperationException("Not supported yet.");
}
}

4 ответа

Решение

относительно editorComponentгде я могу инициализировать эту переменную?

Переменная editorComponent это поле DefaultCellEditor,

Вместо

class CellEditor extends JTextField implements TableCellEditor

рассматривать

class CellEditor extends DefaultCellEditor

Тогда вы можете сделать что-то вроде этого:

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

Приложение: как предложено @ Edoz и проиллюстрировано в этом полном примере, вы можете выборочно Edoz в очередь selectAll() когда щелчок мышью инициирует редактирование.

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;
    }
};

То, что я хочу сделать, - это изменение ячейки (фокус), в следующей выбранной ячейке будет выделен весь текст, готовый для того, чтобы пользователь полностью изменил его.

Решение зависит от вашего точного требования. JTable имеет рендерер и редактор.

Визуализация обычно просто показывает текст в ячейке. Если вы хотите заменить текст, когда начнете печатать, вам нужно сделать две вещи:

а) измените средство визуализации, чтобы отображать текст в "выбранном" состоянии, чтобы пользователь знал, что ввод символа удалит существующий текст; б) измените редактор, чтобы выбрать весь текст при его вызове

Этот подход является относительно сложным, потому что вам понадобится пользовательское средство визуализации для каждого типа данных в вашей таблице (т. Е. String, Integer).

Или другой подход состоит в том, чтобы автоматически переводить каждую ячейку в режим редактирования, когда она получает фокус, и поэтому вам нужно всего лишь изменить редактор, чтобы выделить текст.

Этот подход прост, как вы можете просто сделать:

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();
        }
    }
};

вот как я это сделал

          table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer()
    {
        public Component getTableCellRendererComponent(JTable table, Object 
            value, boolean isSelected,boolean hasFocus,int row,int column)
        {
            super.getTableCellRendererComponent(table, value, isSelected, 
             hasFocus, row, column);
            
            if(isSelected)
            {
                Component editor = table.getEditorComponent();
                if (editor instanceof JTextComponent) 
                {
                    final JTextComponent jtc = (JTextComponent) editor;
            
                    jtc.setCaretPosition(0);
                    
                    jtc.selectAll();
                    jtc.getCaret().setSelectionVisible(true);
                    jtc.getCaret().setVisible(true);
                    jtc.getCaret().setBlinkRate(1000);
                    
                }
            }
            
            return this;
        }
    });
Другие вопросы по тегам