Как выбрать весь текст в ячейке JTable при редактировании

Я хотел бы, чтобы редактор в моих редактируемых JTables выбирал весь текст в ячейке, когда начинал редактировать. Я пробовал пару вещей, которые все вращаются вокруг вызова JTextComponent.selectAll() для компонента, который возвращается из метода TableCellEditor.getTableCellEditorComponent. Ни одна из вещей, которые я пробовал, не срабатывала.

В моей последней попытке я изменил класс SimpleTableDemo из учебника Swing, чтобы использовать собственный TableCellEditor, который вызывает метод selectAll. В отладчике я вижу, что вызывается метод selectAll(), но таблица по-прежнему переходит в режим редактирования, не выбирая текст в ячейке (или, возможно, выбор очищается перед отображением). Этот код приведен ниже. Может ли кто-нибудь сказать мне, где я ошибаюсь?

import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.text.JTextComponent;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class SimpleTableDemo extends JPanel {
    private boolean DEBUG = false;

    public SimpleTableDemo() {
        super(new GridLayout(1,0));

        String[] columnNames = {"First Name",
                                "Last Name",
                                "Sport",
                                "# of Years",
                                "Vegetarian"};

        Object[][] data = {
     {"Kathy", "Smith",
      "Snowboarding", new Integer(5), new Boolean(false)},
     {"John", "Doe",
      "Rowing", new Integer(3), new Boolean(true)},
     {"Sue", "Black",
      "Knitting", new Integer(2), new Boolean(false)},
     {"Jane", "White",
      "Speed reading", new Integer(20), new Boolean(true)},
     {"Joe", "Brown",
      "Pool", new Integer(10), new Boolean(false)}
        };

        final JTable table = new SelectingTable(data, columnNames);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);

        if (DEBUG) {
            table.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    printDebugData(table);
                }
            });
        }

        //Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);

        //Add the scroll pane to this panel.
        add(scrollPane);
    }

    private void printDebugData(JTable table) {
        int numRows = table.getRowCount();
        int numCols = table.getColumnCount();
        javax.swing.table.TableModel model = table.getModel();

        System.out.println("Value of data: ");
        for (int i=0; i 

Ответ 1

Таблица Select All Editor должна работать на вас. Это предпочтительное решение, поэтому вам не нужно создавать собственные редакторы. То есть столбцы, содержащие целые числа, должны принимать только целые числа. С вашим текущим кодом

Ваш код работает частично. Если вы начнете редактирование с помощью клавиши F2, текст будет выбран. Однако, когда вы используете мышь и дважды щелкаете по ячейке, второе событие мыши передается редактору, поэтому каретку можно расположить там, где вы нажали, и это удалит выделение. Решение для этого:

final JTextComponent jtc = (JTextComponent)c;
jtc.requestFocus();
//jtc.selectAll();
SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        jtc.selectAll();
    }
});

Ответ 2

public class SelectAllCellEditor extends DefaultCellEditor
{
    public SelectAllCellEditor(final JTextField textField ) {
        super( textField );
        textField.addFocusListener( new FocusAdapter()
        {
            public void focusGained( final FocusEvent e )
            {
                textField.selectAll();
            }
        } );
    }
}

Ответ 3

JTables может иметь много разных компонентов в ячейке. Обычно вы редактируете JTextField. Сначала вы должны получить поле, а затем выбрать. Вы можете получить длину текста, работая через ваш модальный. Этот код должен начать, вы можете поместить его в обработчик выбора списка. то есть.

 ListSelectionModel rowSM = this.getSelectionModel();
 rowSM.addListSelectionListener(new ListSelectionListener() {
    public void valueChanged(ListSelectionEvent e){
       DefaultCellEditor ed = (DefaultCellEditor)this.getCellEditor();
       JTextField jf = (JTextField)ed.getComponent();
       jf.select(0, *text.length()*);
       jf.requestFocusInWindow();
    }
 });

В частности вам нужно будет найти text.length(). Возможно, что-то вроде:

this.getModel().getValueAt(this.getSelectedRow(), this.getSelectedColumn()).length();

Отказ от ответственности Я не тестировал этот код.