Me gustaría que el editor en mis JTables editables seleccione todo el texto en la celda cuando comience a editar. He intentado un par de cosas que giran alrededor de llamar a JTextComponent.selectAll() en el componente que se devuelve desde el método TableCellEditor.getTableCellEditorComponent. Ninguna de las cosas que intenté funcionó.Cómo seleccionar todo el texto en la celda JTable al editar
En mi último intento, alteré la clase SimpleTableDemo del tutorial de Swing para usar un TableCellEditor personalizado que llama al método selectAll. En el depurador puedo ver que se llama al método selectAll(), pero la tabla sigue yendo al modo de edición sin seleccionar el texto en la celda (o tal vez la selección se borra antes de mostrarse). Ese código está abajo. ¿Alguien puede decirme dónde me estoy equivocando?
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
Gracias, camickr! Pude ver que la selección se estaba realizando, así que pensé que probablemente se eliminaría posteriormente. No pensé en poner otro ejecutable en el subproceso awt para que se ejecutara al final. Miré brevemente su RXTable, y eso se ve interesante. Mi objetivo es proporcionar una clase de tabla base con algunas propiedades que preveo usar a menudo, y probablemente terminaré con algo muy parecido a RXTable. Gracias de nuevo. – user564874
Gran respuesta. Me estaba costando entender por qué selectAll no funciona. La clave es saber que el último clic del mouse va al editor de texto y luego para asegurarse de que se llama a selectAll() después de procesar el último clic del mouse. –
¡Gracias por esta respuesta! Tuve muchos problemas para implementarlo yo mismo. – flash