Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Java] Gestire degli undo

    Ciao a tutti!

    Sto scrivendo in Java un simulatore di assembly PD32. Visto che programma è abbastanza contorto ho diviso il programma in "compartimenti stagni": ovvero un oggetto per l'editor, uno per l'assemblaggio, uno per la simulazione etc... cercando di limitare il più possibile l'interazione.

    Il problema si pone quando devo gestire gli undo-redo nell'editor. Ho provato ad usare (senza conoscere approfonditamente questi oggetti) una JTextArea gestita con un DefaultStyledDocument a cui è associato un UndoManager che implementa l'interfaccia UndoableEditListener, ma quando incollo un po' di testo e poi chiamo il metodo undo() dell'UndoManager mi lancia l'eccezione ArrayIndexOutOfBoundsException e non annulla niente.

    Un'altro caso simpatico è che quando chiudo la finestra (JDialog) del simulatore (che spesso richiede un bel po' di risorse del computer) a volte non funziona il comando undo() (credo che addirittura non funzioni più l'actionEventListener). Questo problema credo sia in qualche modo legato al fatto che il codice non è stato scritto, ma magari è stato letto da un file.

    In ogni caso: sapete come si possono gestire in generale gli undo di un editor? Se ho azzeccato gli oggetti giusti cosa posso aver sbagliato?

    Ciao e grazie!
    SO: Debian Sarge kernel 2.6.11
    Lang: Java, C++, C

  2. #2
    up... visto che ci sono vi pongo un altro quesito: è possibile all'interno del metodo windowClosing(WindowEvent e) di un windowListener fare in modo che la finestra (magari se l'utente annulla l'uscita dal programma) non si chiuda?

    Ai posteri la sentenza?
    SO: Debian Sarge kernel 2.6.11
    Lang: Java, C++, C

  3. #3
    Con gli InternalFrame avevo fatto una cosa del genere

    codice:
    public void vetoableChange(PropertyChangeEvent event) throws PropertyVetoException{
                         String name = event.getPropertyName();
                         Object value = event.getNewValue();
                         if(desktop.getSelectedFrame() instanceof InternalFrame){
                         InternalFrame u=(InternalFrame)(desktop.getSelectedFrame());
                         if (name.equals("closed")  && value.equals(Boolean.TRUE) && u.isUpdate()==true)
                         {
                            int result=JOptionPane.showConfirmDialog(iframe,"Il file non è stato salvato.\n Salvare?","File non salvato",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE);
    
                            if (result == JOptionPane.YES_OPTION){
                            u.setSave();
                            }else if(result ==JOptionPane.CANCEL_OPTION){
                              throw new PropertyVetoException("User Canceled close",event);
                            }
                         }//if name.equals
                         }
                    }
    Penso si possa fare una cosa simile con i WindowListener
    Lang=Java
    Ambiente = Eclipse forever
    Ubuntu & Win XP Pro

  4. #4

    Mezza soluzione

    Ti ringrazio della dritta, ma non sono riuscito ad applicarla: non riuscivo a gestire l'eccezione PropertyVetoException. Nel caso del WindowListener chi la deve gestire?

    Alla fine ho risolto con una soluzione brutale ma efficace:

    codice:
        // non vuole più chiudere:
        String sorg = sorgente.getText();
        MainClass m = new MainClass();
        m.sorgente.setText(sorg);
        m.cambiato = true;
    Nel caso che l'utente cambi idea viene chiuso l'editor, ma ne viene subito creato un'altro contenente il testo dell'appena defunto predecessore.

    Sinceramente questa soluzione non mi convince molto, ma almeno funziona.

    Qualcuno sa fare di meglio? Qualcuno sa come gestire quei maledetti undo?

    Ciauz!
    SO: Debian Sarge kernel 2.6.11
    Lang: Java, C++, C

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.