Спасибо за ответ. Я тоже не проверял ваш код - сначала попробовал предложение camickr, и оно сработало. У меня уже была ссылка на JTextField, но мой выбор стирался. Помещение вызова selectAll () в runnable для последующего выполнения - вот что решило проблему. Еще раз спасибо за ответ.

ел бы, чтобы редактор в моих редактируемых 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 < numRows; i++) {
            System.out.print("    row " + i + ":");
            for (int j = 0; j < numCols; j++) {
                System.out.print("  " + model.getValueAt(i, j));
            }
            System.out.println();
        }
        System.out.println("--------------------------");
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("SimpleTableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        SimpleTableDemo newContentPane = new SimpleTableDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }


    class SelectingTable extends JTable {
        public SelectingTable(Object[][] data, String[] columnNames) {
            super(data, columnNames);
            TableColumnModel model = super.getColumnModel();
            for (int i = 0; i < super.getColumnCount(); i++) {
                TableColumn tc = model.getColumn(i);
                tc.setCellEditor(new SelectingEditor(new JTextField()));
            }
        }

        class SelectingEditor extends DefaultCellEditor {

            public SelectingEditor(JTextField textField) {
                super(textField);
            }

            public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
                Component c = super.getTableCellEditorComponent(table, value, isSelected, row, column);
                if (c instanceof JTextComponent) {
                    JTextComponent jtc = (JTextComponent) c;
                    jtc.requestFocus();
                    jtc.selectAll();
                }
                return c;
            }
        }
    }
}

Ответы на вопрос(3)

Решение Вопроса

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

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

final JTextComponent jtc = (JTextComponent)c;
jtc.requestFocus();
//jtc.selectAll();
SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        jtc.selectAll();
    }
});
 Santosh Tiwari22 июн. 2011 г., 00:44
Отличный ответ. Мне было трудно понять, почему selectAll не работает. Ключ должен знать, что последний щелчок мыши идет в текстовый редактор, а затем убедиться, что selectAll () вызван после обработки последнего щелчка мыши.
 user56487406 янв. 2011 г., 05:10
Спасибо, Камикр! Я мог видеть, что выбор был сделан, таким образом я полагал, что это вероятно удалялось впоследствии. Не думал ставить еще один работающий поток в потоке awt, чтобы он выполнялся последним. Я кратко посмотрел на ваш RXTable, и это выглядит интересно. Моя цель - предоставить базовому классу таблицы некоторые свойства, которые я ожидаю часто использовать, и я, вероятно, в итоге получу нечто очень похожее на RXTable. Еще раз спасибо.
 mike rodent19 сент. 2013 г., 18:42
@camickr - ответы приняты. Мне просто интересно, как трудно было бы остановить JTable, передавая нежелательное событие мыши редактору. Я провел эксперимент с mouse_event.consume () ... но, естественно, он не работал должным образом ...
 flash25 авг. 2011 г., 12:40
Спасибо за этот ответ! У меня было много проблем с его внедрением.
 Emmanuel Bourg13 нояб. 2011 г., 01:46
Я рекомендую помещать вызов requestFocus () в invokeLater, он позволяет выбирать текст, когда editCellAt вызывается непосредственно вашим кодом.
public class SelectAllCellEditor extends DefaultCellEditor
{
    public SelectAllCellEditor(final JTextField textField ) {
        super( textField );
        textField.addFocusListener( new FocusAdapter()
        {
            public void focusGained( final FocusEvent e )
            {
                textField.selectAll();
            }
        } );
    }
}
 Chris Leyva06 янв. 2014 г., 19:49
Можете ли вы объяснить свое исправление также на английском языке?

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

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

отказ Я не проверял этот код.

 user56487406 янв. 2011 г., 05:17
Спасибо за ответ. Я тоже не проверял ваш код - сначала попробовал предложение camickr, и оно сработало. У меня уже была ссылка на JTextField, но мой выбор стирался. Помещение вызова selectAll () в runnable для последующего выполнения - вот что решило проблему. Еще раз спасибо за ответ.

Ваш ответ на вопрос