|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2001
Città: Forlì
Messaggi: 268
|
[Java] Problema action
Nella mia applicazione c'è una JTextarea utilizzata come editor.
Il problema è nelle actions. - Prima dichiaro un array di action aggiuntive Codice:
private Action[] defaultActions = { new NewAction(), new OpenAction(), new SaveAction() ... ecc } Codice:
Action[] actions = getActions(); for (int i = 0; i < actions.length; i++) { Action a = actions[i]; commands.put(a.getValue(Action.NAME).toString(), a); } Codice:
protected Action[] getActions() { return TextAction.augmentList(editor.getActions(), defaultActions); } 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?
__________________
Asus P5K-E | E6600 @3.2ghz | Artic Freezer 7 Pro | 2X1GB Corsair PC6400 | Sparkle nVidia 8800 GTS 320MB | HD Hitachi 320GB SataII | Maxtor 300GB EIDE | DVD Optiarc AD-7170S | Monitor LCD Acer AL1917 19'' | Monitor Philips 109B CRT 19'' |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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 Codice:
return TextAction.augmentList(defaultActions, editor.getActions());
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Oct 2001
Città: Forlì
Messaggi: 268
|
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 ![]() Codice:
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);
__________________
Asus P5K-E | E6600 @3.2ghz | Artic Freezer 7 Pro | 2X1GB Corsair PC6400 | Sparkle nVidia 8800 GTS 320MB | HD Hitachi 320GB SataII | Maxtor 300GB EIDE | DVD Optiarc AD-7170S | Monitor LCD Acer AL1917 19'' | Monitor Philips 109B CRT 19'' |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Oct 2001
Città: Forlì
Messaggi: 268
|
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! ![]() 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! ![]()
__________________
Asus P5K-E | E6600 @3.2ghz | Artic Freezer 7 Pro | 2X1GB Corsair PC6400 | Sparkle nVidia 8800 GTS 320MB | HD Hitachi 320GB SataII | Maxtor 300GB EIDE | DVD Optiarc AD-7170S | Monitor LCD Acer AL1917 19'' | Monitor Philips 109B CRT 19'' |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:05.