2011-01-06 18 views
10

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

Respuesta

8

El Table Select All Editor debe trabajar para usted. Es la solución preferida por lo que no tiene que seguir creando editores personalizados. Es decir, las columnas que contienen números enteros solo deben aceptar números enteros. Con su código actual

Su código funciona parcialmente. Si comienza a editar usando la tecla F2, entonces se selecciona el texto. Sin embargo, cuando usa el mouse y hace doble clic en la celda, el segundo evento del mouse se pasa al editor para que el cursor se pueda colocar donde hizo clic y esto elimina la selección. Una solución para esto es:

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

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

+0

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. –

+0

¡Gracias por esta respuesta! Tuve muchos problemas para implementarlo yo mismo. – flash

-1

JLas computadoras pueden tener muchos componentes diferentes en una celda. Por lo general, es un JTextField cuando está editando. Primero debe obtener el campo y luego seleccionar. Puede obtener la longitud del texto trabajando a través de su modal. Este código debe ayudarlo a comenzar, puede colocarlo dentro de un manejador de selección de Lista. es decir.

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

En particular, tendrá que encontrar el texto.length(). Posiblemente algo como:

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

Negación No he probado este código.

+0

Gracias por la respuesta. Tampoco probé tu código. Probé la sugerencia de Camickr primero, y funcionó. Ya tenía una referencia al JTextField, pero mi selección se borraba. Poner la llamada selectAll() en un ejecutable para ejecutar al final es lo que resolvió el problema. Gracias de nuevo por la respuesta. – user564874

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(); 
      } 
     }); 
    } 
} 
+2

¿Puedes explicarme tu corrección en inglés también? –

Cuestiones relacionadas