PDA

View Full Version : [Java] Problema action


alexievic
09-10-2007, 18:00
Nella mia applicazione c'è una JTextarea utilizzata come editor.
Il problema è nelle actions.

- Prima dichiaro un array di action aggiuntive

private Action[] defaultActions = { new NewAction(), new OpenAction(),
new SaveAction() ... ecc }

- poi inserisco le action in una Hashtable 'commands' che serve per richiamare le action tramite nome all'interno del programma

Action[] actions = getActions();
for (int i = 0; i < actions.length; i++)
{
Action a = actions[i];
commands.put(a.getValue(Action.NAME).toString(), a);
}

- il metodo getActions qui sopra è questo:

protected Action[] getActions()
{
return TextAction.augmentList(editor.getActions(), defaultActions);
}

Io apro una JDialog (implementata in un altro file) che ha dentro dei campi di testo JTextField. Il problema che si presenta è che in tutti questi campi non funziona più il copia e incolla tramite tastiera (CTRL+C, ecc).
Commentando la return del metodo getActions tornano funzionanti quindi immagino che sia dovuto a quella riga di codice.
In ogni modo non riesco a spiegarmi perchè quel metodo statico di TextAction vada ad influire sugli altri controlli del programma, se non sbaglio il suo compito non è solo quello di aumentare la lista di action passati come primo argomento con quelle passate come secondo argomento? Perchè vanno a modificare le action degli altri controlli del programma?

PGI-Bis
09-10-2007, 18:49
E' possibile che sia per questa ragione (estratto dalla documentazione per TextAcion.augment):

"The second list takes precedence over the first list; that is, when both lists contain a command with the same name, the command from the second list is used."

Puoi capire subito se c'è un conflitto di nomi invertendo i parametri della tua invocazione di augmentList

return TextAction.augmentList(defaultActions, editor.getActions());

Se le combinazioni predefinite riappaiono allora è un problema di nomi. Altrimenti è un bel mistero. Forse usi gli stessi acceleratori per azioni diverse?

alexievic
09-10-2007, 23:14
Innanzi tutto ti ringrazio per i consigli.
Ho provato ad invertire le due liste ma le cose non cambiano.
Per attivare le action di copia, incolla e taglia in un campo (ho fatto una prova solo li) ho dovuto fare una cosa del genere :rolleyes:

JTextField owlurlpathField = new JTextField(30);

Keymap parent = owlurlpathField.getKeymap();
Keymap newmap = JTextComponent.addKeymap("KeymapMap", parent);
KeyStroke u = KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK);
Action actionU = new DefaultEditorKit.CopyAction();
newmap.addActionForKeyStroke(u, actionU);
KeyStroke p = KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK);
Action actionP = new DefaultEditorKit.PasteAction();
newmap.addActionForKeyStroke(p, actionP);
KeyStroke x = KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK);
Action actionX = new DefaultEditorKit.CutAction();
newmap.addActionForKeyStroke(x, actionX);
owlurlpathField.setKeymap(newmap);

In questo modo nel campo suddetto ritornano operative le action interessate, però dovrei farlo in altri 3/4 campi ed immagino esista un altro modo per risolvere il problema dovuto molto probabilmente alla TextAction.augmentList.

PGI-Bis
10-10-2007, 19:06
Il problema non è tanto se esistano alternative (potresti usare la mappa delle azioni dei tuoi componenti per registrare nuove azioni) ma perchè quel getActions non funziona. Io ho provato a guardare ma non mi sembra che a parte il "name clash" esistano altri conflitti che possano comportare l'invalidità delle azioni predefinite fuse con le nuove tramite TextAction.augmentList. Misteri dell'informatica.

alexievic
10-10-2007, 20:51
Ho trovato il problema oggi, ti ringrazio!
Praticamente era colpa di un metodo che attivava e disattivava alcune action condivise (eh, se non sarebbero action!). In pratica le disattivava quando il file non era ancora stato aperto nell'editor e dopo li riattivava. Il problema è che nel dialogo di creazione nuovo progetto poi non funzionavano copia, incolla e taglia all'interno dei JTextField.
Ho risolto facendo un controllo che riattiva le action prima di mostrare il dialogo e poi le ripristina allo stato precedente una volta che viene chiuso. Trattandosi di dialogo modale non vi sono problemi.
Quindi era colpa mia! :D

Ora però ho un problema ben più complesso da risolvere!
Devo gestire l'undo relativamente a gruppi di modifiche sul document dell'editor.
In pratica utilizzo il metodo replace sul document dell'area di testo per rimpiazzare un testo normale con un testo con attributi (classe AttributeSet) personalizzati più uno per la sottolineatura. Il problema è che l'undo è gestito per ogni singola operazione atomica di modifica sul document e invece la replace non è atomica ed esegue due operazioni (prima elimina poi mette il testo nuovo).
Sto guardando il javadoc delle varie classi di gestione del sistema undo ma ci capisco sempre meno e non ho ancora trovato documentazione o tutorial pratici che spieghino come utilizzare undo/redo su comandi composti.

Comunque mi sa che sono andato un tantino off-topic! :p