Je fais un éditeur de texte à l'aide de Java Swing. J'utilise jtextarea pour la même chose. Je veux savoir comment je peux utiliser les fonctionnalités d'annulation et de redo dans JTextarea, car je ne suis pas en mesure de l'utiliser. P>
5 Réponses :
Son été depuis longtemps puisque je l'ai fait et que je ne me souviens pas des détails, mais voici un lien avec quelques informations: http://java.sun.com/docs/books/tatudial/uiswing/components/generaltext.html P>
Faites défiler jusqu'à la section intitulée «Écoute des modifications sur un document» pour commencer. P>
+1, qui est la personne qui a baissé cela ?? Le tutoriel a un exemple de travail et explique ce qui se passe, ce qui répond le plus certainement à la question. Maintenant, il appartient à l'OP de lire le tutoriel, l'OP aurait dû lire le tutoriel avant de poster cette question. En fait, si l'utilisateur n'était pas au courant du tutoriel de swing avant qu'ils ne connaissent avoir accès à une référence précieuse qui peut aider à des questions futures. C'est la façon dont toutes les questions doivent être répondues.
Merci pour vos remarques sarcastiques Camickr. Merci d'avoir aidé Marshall.
Si je comprends bien, JTextarea n'a pas de fonctionnalité inhérente des annulations / redo intégrées, mais un Recherche Google a trouvé Cet article qui pourrait être utile. p>
Il existe apparemment un Undo Manager a> in javax.swing code> que vous pouvez accrocher aux événements de changement de JTextarea. P>
Voici un lien avec un exemple plus complet: Java- forums.org/javax-swing/9570-undo-redo-jtextarea.html
@Petar Le code derrière votre lien ne gère pas ce qui se passe lorsque tout le texte est sélectionné et remplacé par le contenu du Presse-papiers. Ce qui se passe, c'est que la zone de texte est vidée au lieu d'être remplacée par son ancien contenu. Repro: (1) Mettez quelque chose dans le Presse-papiers (2) Sélectionnez tous les caractères de la zone de texte, (3) Appuyez sur ^ V pour coller le presse-papiers sur le contenu sélectionné. Je ne sais pas encore ce qui se passe mais j'ai l'intention de savoir. Il en va de même pour le code derrière le lien posté dans cette réponse. J'ai le sentiment que le problème est la définition du "contenu précédent".
Le problème est que lorsque vous sélectionnez tout texte et appuyez sur ^ v (Coller), il y a deux événements enregistrés non un. Le premier événement est un événement Supprimer tout événement et le second est un événement d'insertion.
@Pearminchev La réponse est ici où nous voyons comment remplacer la méthode de remplacement dans un plaindocument.
Vous pouvez faire comme ça une fois que le gestionnaire est attaché au document de JTextarea, il surveillera toutes les modifications.
au contenu de la zone de texte. p> Après avoir attaché le gestionnaire sur le composant texte, vous devez fournir certains moyens de dire que
Le gestionnaire pour annuler / refaire une opération. P> Appelez le vide public Vide annuler () et le vide public de rédo () de l'onduleur si nécessaire (par exemple, une méthode Actionperformed () d'une action d'action) P> Vous pouvez attacher des objets d'action à un bouton de la manière suivante au lieu d'appeler des méthodes d'annulation () et de redo () qui simplifie la tâche: p>
Est-ce que UndomanagerHelper code> de la classe définie? Je ne reçois pas l'autocoptétion pour cela à Eclipse. J'ai également cherché une documentation Oracle Java, mais je ne peux pas trouver cette classe. J'utilise Java 8
J'ai dû passer à travers plusieurs liens pour obtenir une aide suffisante. J'ajoute ici ce que j'ai mis en œuvre avec succès pour aider les futurs visiteurs. J'ai mis en œuvre cela en utilisant jtextpane, mais je suppose que la même chose s'appliquerait à la JTextarea
JTextArea textArea = new JTextArea();
JButton undo = new JButton("Undo");
JButton redo = new JButton("Redo");
KeyStroke undoKeyStroke = KeyStroke.getKeyStroke(
KeyEvent.VK_Z, Event.CTRL_MASK);
KeyStroke redoKeyStroke = KeyStroke.getKeyStroke(
KeyEvent.VK_Y, Event.CTRL_MASK);
UndoManager undoManager = new UndoManager();
Document document = textArea.getDocument();
document.addUndoableEditListener(new UndoableEditListener() {
@Override
public void undoableEditHappened(UndoableEditEvent e) {
undoManager.addEdit(e.getEdit());
}
});
// Add ActionListeners
undo.addActionListener((ActionEvent e) -> {
try {
undoManager.undo();
} catch (CannotUndoException cue) {}
});
redo.addActionListener((ActionEvent e) -> {
try {
undoManager.redo();
} catch (CannotRedoException cre) {}
});
// Map undo action
textArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
.put(undoKeyStroke, "undoKeyStroke");
textArea.getActionMap().put("undoKeyStroke", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
try {
undoManager.undo();
} catch (CannotUndoException cue) {}
}
});
// Map redo action
textArea.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
.put(redoKeyStroke, "redoKeyStroke");
textArea.getActionMap().put("redoKeyStroke", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
try {
undoManager.redo();
} catch (CannotRedoException cre) {}
}
});
J'ai créé une classe simple qui peut attribuer des fonctionnalités d'annulation à un jtextComponent (JTextfield, JTextarea, etc.) avec un appel de méthode unique:
public class UndoTool {
private static final String REDO_KEY = "redo";
private static final String UNDO_KEY = "undo";
private JTextComponent component;
private KeyStroke undo = KeyStroke.getKeyStroke("control Z");
private KeyStroke redo = KeyStroke.getKeyStroke("control Y");
public UndoTool(JTextComponent component) {
this.component = component;
}
public void setUndo(KeyStroke undo) {
this.undo = undo;
}
public void setRedo(KeyStroke redo) {
this.redo = redo;
}
public static void addUndoFunctionality(JTextComponent component) {
UndoTool tool = new UndoTool(component);
UndoManager undo = tool.createAndBindUndoManager();
tool.bindUndo(undo);
tool.bindRedo(undo);
}
public static JTextArea createJTextAreaWithUndo() {
JTextArea area = new JTextArea();
addUndoFunctionality(area);
return area;
}
public static JTextField createJTextFieldWithUndo() {
JTextField field = new JTextField();
addUndoFunctionality(field);
return field;
}
public UndoManager createAndBindUndoManager() {
Check.notNull(component);
UndoManager manager = new UndoManager();
Document document = component.getDocument();
document.addUndoableEditListener(event -> manager.addEdit(event.getEdit()));
return manager;
}
public void bindRedo(UndoManager manager) {
component.getActionMap().put(REDO_KEY, new AbstractAction(REDO_KEY) {
@Override
public void actionPerformed(ActionEvent evt) {
try {
if (manager.canRedo()) {
manager.redo();
}
} catch (CannotRedoException ignore) {
}
}
});
component.getInputMap().put(redo, REDO_KEY);
}
public void bindUndo(UndoManager manager) {
component.getActionMap().put(UNDO_KEY, new AbstractAction(UNDO_KEY) {
@Override
public void actionPerformed(ActionEvent evt) {
try {
if (manager.canUndo()) {
manager.undo();
}
} catch (CannotUndoException ignore) {
}
}
});
component.getInputMap().put(undo, UNDO_KEY);
}
}