Как сделать JTable на cellchange выделить весь текст - PullRequest
4 голосов
/ 13 декабря 2011

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

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

Любые идеи о том, как это сделать?

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

реализовать это
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.");
}
}

Ответы [ 3 ]

11 голосов
/ 13 декабря 2011

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

Решение зависит от вашего точного требования. В 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();
        }
    }
};
5 голосов
/ 13 декабря 2011

относительно 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 и проиллюстрировано в этом полном примере , вы можете выборочно ставить в очередь 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;
    }
};
2 голосов
/ 13 декабря 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...