This example demonstrates how to implement an editing command. There are two steps when creating a custom command. The first is to create an action object that executes the desired functionality and then installs the action object in the component. The second is to bind a keystroke to the action object using an inputmap.
Text component actions should extend from TextAction. TextAction has a convenience method for finding the appropriate text component on which to operate.
This example implements a Lowercase command that converts characters to lowercase. If the selection is empty, the command converts the character following the caret and then moves the caret forward one space. If the selection is not empty, the command converts the characters in the selection.
JTextArea comp = new JTextArea();
// Bind F2 to the lowercase action
String actionName = "Lowercase";
comp.getInputMap().put(KeyStroke.getKeyStroke("F2"), actionName);
// Install the action
comp.getActionMap().put(actionName,
new TextAction(actionName) {
public void actionPerformed(ActionEvent evt) {
lowercaseSelection(getTextComponent(evt));
}
}
);
public static void lowercaseSelection(JTextComponent comp) {
if (comp.getSelectionStart() == comp.getSelectionEnd()) {
// There is no selection, only a caret
if (comp.getCaretPosition() < comp.getDocument().getLength()) {
// The caret must be at least one position left of the end
try {
int pos = comp.getCaretPosition();
Document doc = comp.getDocument();
String str = doc.getText(pos, 1).toLowerCase();
doc.remove(pos, 1);
doc.insertString(pos, str, null);
comp.moveCaretPosition(pos+1);
} catch (BadLocationException e) {
}
}
} else {
// There is a selection
int s = comp.getSelectionStart();
int e = comp.getSelectionEnd();
comp.replaceSelection(comp.getSelectedText().toLowerCase());
comp.select(s, e);
}
}