Domanda

Problema

Voglio le capacità di Jxtable con il comportamento "seleziona tutto su modifica" di Rxtable. Fare una semplice sovraccarico andrebbe bene, ma la funzione a doppio clic di RXTable non funziona con JXTable. Quando si utilizza la modalità di azione del pulsante va bene, ma quando si utilizza F2 o un doppio clic su qualcosa negli scontri Jxtable con rxtable e rimuovi la selezione in modo che mi resta con il comportamento predefinito. È a causa del genericetor che usa internamente o è qualcos'altro?

Come posso ottenere JXTable per selezionare tutto su F2 o fare doppio clic su Modifica?

EDIT: sembra che ciò accada solo quando il modello ha la colonna definita per il tipo intero. Funziona come previsto quando è definito per una colonna stringa o oggetto.

Soluzione

Grazie alla correzione di Kleopatra sono stato in grado di modificare il metodo SelectAll in modo che gestisca JFormattExtExtfields e tutti i casi di modifica. Dato che il codice originale ha funzionato sul tipo per modificare, ho appena usato la correzione per altri casi. Ecco cosa ho finito.

Sostituisci SelectAll in RXTable con quanto segue:

/*
 * 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();
        }
    });
}
È stato utile?

Soluzione

Un rapido hack che lavora per due dei tre tipi di selezione

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

è stato ricordato del trucco da Come selezionare tutto il testo in un campo JFormattedtext quando si concentra? - Non gestisce il caso all'avvio della modifica digitando, in questo caso il contenuto non viene eliminato (come per un campo di testo normale) ma viene aggiunta la nuova chiave.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top