Pregunta

Problema

Quiero las capacidades de Jxtable con el comportamiento de "seleccionar todo en editar" de Rxtable. Hacer una simple anulación estaría bien, pero la función de doble clic del rxtable no funciona con JXTable. Cuando se usa el modo de acción del botón, está bien, pero cuando se usa F2 o un doble, haga clic en algo en choques JXTABLE con RXTable y elimine la selección para que me quede el comportamiento predeterminado. ¿Se debe al generador generado que usa internamente o es otra cosa?

¿Cómo puedo obtener JXTable para seleccionar todo en F2 o Haga doble clic en Editar?

Editar: parece que esto solo sucede cuando el modelo tiene la columna definida para el tipo entero. Funciona como se esperaba cuando se define para una columna de cadena u objeto.

Solución

Gracias a la solución de Kleopatra, pude alterar el método SelectALL para que maneja JFormattedTextFields y todos los casos de edición. Dado que el código original funcionó en el tipo para editar, acabo de utilizar la solución para otros casos. Esto es lo que terminé.

Reemplace Selectall en rxtable con lo siguiente:

/*
 * Select the text when editing on a text related cell is started
 */
private void selectAll(EventObject e)
{
    final Component editor = getEditorComponent();

    if (editor == null
        || ! (editor instanceof JTextComponent 
                || editor instanceof JFormattedTextField))
        return;

    if (e == null)
    {
        ((JTextComponent)editor).selectAll();
        return;
    }

    //  Typing in the cell was used to activate the editor

    if (e instanceof KeyEvent && isSelectAllForKeyEvent)
    {
        ((JTextComponent)editor).selectAll();
        return;
    }

    // If the cell we are dealing with is a JFormattedTextField
    //    force to commit, and invoke selectall

    if (editor instanceof JFormattedTextField) {
           invokeSelectAll((JFormattedTextField)editor);
           return;
    }

    //  F2 was used to activate the editor

    if (e instanceof ActionEvent && isSelectAllForActionEvent)
    {
        ((JTextComponent)editor).selectAll();
        return;
    }

    //  A mouse click was used to activate the editor.
    //  Generally this is a double click and the second mouse click is
    //  passed to the editor which would remove the text selection unless
    //  we use the invokeLater()

    if (e instanceof MouseEvent && isSelectAllForMouseEvent)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                ((JTextComponent)editor).selectAll();
            }
        });
    }
}

private void invokeSelectAll(final JFormattedTextField editor) {
    // old trick: force to commit, and invoke selectall
    editor.setText(editor.getText());
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            editor.selectAll();
        }
    });
}
¿Fue útil?

Solución

Un truco rápido que funciona para dos de los tres tipos de selección

       // in selectAll(EventObject) special case the formatted early
       if (editor instanceof JFormattedTextField) {
           invokeSelectAll(editor);
           return;
       }


        private void invokeSelectAll(final JFormattedTextField editor) {
            // old trick: force to commit, and invoke selectall
            editor.setText(editor.getText());
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    editor.selectAll();
                }
            });
        }

fue recordado por el truco por ¿Cómo seleccionar todo el texto en un JFormatTEDTextField cuando se enfoca? - No maneja el caso cuando se inicia editar escribiendo, en este caso el contenido no se elimina (como para un campo de texto normal) pero se agrega la nueva clave.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top