Servus, ich habe ein Problem mit den Redo bzw. Undo Befehl...
Ich habe diese wie folgt implementiert..
In einer Menubar.java werden die beiden Funktionen wie folgt aufgerufen:
In der Haupt View Komponenten wird der Listener hier initialisiert.
Tastatureingaben versteht er. Wenn man etwas ausschneidet oder normal löscht auch.
Das Problem ist aber folgendes:
Die JTextArea enhält zu Beginn ein Wort.
Man kann über eine Tabelle, Werte hinzufügen zu diesem Textbereich. Wenn ich hier aber jetzt diesen Schritt rückgängig machen möchte, löscht der Undo Befehl den kompletten Inhalt der JTextArea. Und nicht nur den neu hinzugekommenen Text. Hier ist der Action Listener:
Hier der Code um die JTextArea mit Inhalt dann zu versorgen.
Ich glaub, das war der gesamte Code der einen Einfluss darauf nimmt. Es werden die Werte der Tabelle eingelesen und in die JTextArea geladen. Und genau dies versteht der Redo/Undo Befehl überhaupt nullinger...
Es wird jedesmal, wenn man das Hinzufügen eines Tabelleninhalts rückgängig machen will, die gesamte JTextArea leer gemacht. Egal wieviel da drin steht. Gibt es irgend eine Möglichkeit, wie man es den Befehlen sagen kann, dass NUR die neuen Werte gelöscht werden sollen? Oder wäre die einzige andere Möglichkeit manuell die "Undo" Fähigkeit für dies hier zu deaktivieren?
Ich habe diese wie folgt implementiert..
Java:
public class UndoRedoListener implements UndoableEditListener {
public static UndoManager undo = new UndoManager();
public void undoableEditHappened(UndoableEditEvent e) {
//Remember the edit and update the menus
undo.addEdit(e.getEdit());
updateUndoState();
updateRedoState();
}
public static void updateUndoState() {
if (undo.canUndo()) {
Menubar.editUndo.setEnabled(true);
} else {
Menubar.editUndo.setEnabled(false);
}
}
public static void updateRedoState() {
if (undo.canRedo()) {
Menubar.editRedo.setEnabled(true);
} else {
Menubar.editRedo.setEnabled(false);
}
}
}
In einer Menubar.java werden die beiden Funktionen wie folgt aufgerufen:
Java:
editUndo.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
UndoRedoListener.undo.undo();
} catch (final CannotUndoException ex) {
System.out.println("Unable to undo: " + ex);
ex.printStackTrace();
}
UndoRedoListener.updateUndoState();
UndoRedoListener.updateRedoState();
}
});
editRedo.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
UndoRedoListener.undo.redo();
} catch (final CannotRedoException ex) {
System.out.println("Unable to redo: " + ex);
ex.printStackTrace();
}
UndoRedoListener.updateRedoState();
UndoRedoListener.updateUndoState();
}
});
In der Haupt View Komponenten wird der Listener hier initialisiert.
Java:
PipelinePanel.pipeTextArea.getDocument().addUndoableEditListener(new UndoRedoListener());
Tastatureingaben versteht er. Wenn man etwas ausschneidet oder normal löscht auch.
Das Problem ist aber folgendes:
Die JTextArea enhält zu Beginn ein Wort.
Man kann über eine Tabelle, Werte hinzufügen zu diesem Textbereich. Wenn ich hier aber jetzt diesen Schritt rückgängig machen möchte, löscht der Undo Befehl den kompletten Inhalt der JTextArea. Und nicht nur den neu hinzugekommenen Text. Hier ist der Action Listener:
Java:
OKButton.addActionListener( new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (baum.isSelectedCommandName()) {
parameterTablePanel.getParameterModel().fireTableDataChanged();
UpdatePipeline.addText(
baum.getSelectedCommandName().split(" ")[0], //$NON-NLS-1$
parameterTablePanel.getParameterModel().getParameters(),
parameterTablePanel.getParameterModel().getValues()
);
IMapController.IsSaved = false;
}
}
});
Hier der Code um die JTextArea mit Inhalt dann zu versorgen.
Java:
public class UpdatePipeline {
/** Add command with array parameters */
public static void addText(final String commandName, final String[] params, final String[] value) {
final StringBuffer buf = new StringBuffer(PipelinePanel.pipeTextArea.getText());
buf.append(" ");
buf.append(commandName);
...
for (int i = 0; i < params.length; i++) {
buf.append(" ");
buf.append(params[i]);
buf.append("=");
buf.append((value[i] == null) ? "" : value[i]);
}
}
PipelinePanel.pipeTextArea.setText(buf.toString());
}
}
Ich glaub, das war der gesamte Code der einen Einfluss darauf nimmt. Es werden die Werte der Tabelle eingelesen und in die JTextArea geladen. Und genau dies versteht der Redo/Undo Befehl überhaupt nullinger...
Es wird jedesmal, wenn man das Hinzufügen eines Tabelleninhalts rückgängig machen will, die gesamte JTextArea leer gemacht. Egal wieviel da drin steht. Gibt es irgend eine Möglichkeit, wie man es den Befehlen sagen kann, dass NUR die neuen Werte gelöscht werden sollen? Oder wäre die einzige andere Möglichkeit manuell die "Undo" Fähigkeit für dies hier zu deaktivieren?
Zuletzt bearbeitet: