Как выделить весь текст в ячейке JTable при редактировании - PullRequest
12 голосов
/ 06 января 2011

Я бы хотел, чтобы редактор в моих редактируемых 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 ]

8 голосов
/ 06 января 2011

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

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

final JTextComponent jtc = (JTextComponent)c;
jtc.requestFocus();
//jtc.selectAll();
SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        jtc.selectAll();
    }
});
3 голосов
/ 06 января 2014
public class SelectAllCellEditor extends DefaultCellEditor
{
    public SelectAllCellEditor(final JTextField textField ) {
        super( textField );
        textField.addFocusListener( new FocusAdapter()
        {
            public void focusGained( final FocusEvent e )
            {
                textField.selectAll();
            }
        } );
    }
}
0 голосов
/ 06 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...