Java Tutorial/Swing/JTextComponent
Содержание
- 1 Accessing the System Clipboard
- 2 Better way to set the selection
- 3 CaretListener Interface and CaretEvent Class
- 4 Default Editor Kit: cutAction
- 5 Document and DocumentFilter
- 6 Drawing in the Background of a Component
- 7 Enabling Text-Dragging on a JTextComponent
- 8 Enumerating All the Views in a JTextComponent
- 9 Filter all editing operations on a text component
- 10 GIF Writer
- 11 Highlight a word in JTextComponent
- 12 JTextComponent: the parent class for all the components used as textual views.
- 13 Limiting the Capacity of a JTextComponent
- 14 Listening for Caret Movement Events in a JTextComponent
- 15 Listening for Editing Changes in a JTextComponent
- 16 Listening to JTextField Events with an KeyListener
- 17 Listening to Text Components Events with a DocumentListener
- 18 Listening to Text Components Events with an ActionListener
- 19 Listening to Text Components Events with an InputVerifier
- 20 Loading and Saving Content
- 21 Modifying Text in a JTextComponent: Append some text
- 22 Modifying Text in a JTextComponent: Delete the first 5 characters
- 23 Modifying Text in a JTextComponent: Insert some text after the 5th character
- 24 Modifying Text in a JTextComponent: Insert some text at the beginning
- 25 Modifying Text in a JTextComponent: Replace the first 3 characters with some text
- 26 Moving the Caret of a JTextComponent
- 27 Overriding the Default Action of a JTextComponent
- 28 Register Keyboard action: registerKeyboardAction
- 29 Remove Highlighting in a JTextComponent
- 30 Remove Key action from Text component
- 31 Restricting Caret Movement: NavigationFilter
- 32 Set the caret color
- 33 Set the color behind the selected text
- 34 Setting the Blink Rate of a JTextComponent"s Caret
- 35 Share Document
- 36 Sharing a Document Between JTextComponents
- 37 TextAction Name Constants
- 38 Text Component Printing
- 39 Text component supports both cut, copy and paste (using the DefaultEditorKit"s built-in actions) and drag and drop
- 40 Using Text Component Actions
- 41 Using the Selection of a JTextComponent
Accessing the System Clipboard
<source lang="java">
import java.awt.BorderLayout; import java.util.Hashtable; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.text.DefaultEditorKit; public class CutPasteSample {
public static void main(String args[]) { JFrame frame = new JFrame("Cut/Paste Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextField textField = new JTextField(); frame.add(textField, BorderLayout.NORTH); Action actions[] = textField.getActions(); Action cutAction = findAction(actions, DefaultEditorKit.cutAction); Action copyAction = findAction(actions, DefaultEditorKit.copyAction); Action pasteAction = findAction(actions, DefaultEditorKit.pasteAction); JPanel panel = new JPanel(); frame.add(panel, BorderLayout.SOUTH); JButton cutButton = new JButton(cutAction); cutButton.setText("Cut"); panel.add(cutButton); JButton copyButton = new JButton(copyAction); copyButton.setText("Copy"); panel.add(copyButton); JButton pasteButton = new JButton(pasteAction); pasteButton.setText("Paste"); panel.add(pasteButton); frame.setSize(250, 250); frame.setVisible(true); } private static Action findAction(Action actions[], String key) { Hashtable<Object, Action> commands = new Hashtable<Object, Action>(); for (int i = 0; i < actions.length; i++) { Action action = actions[i]; commands.put(action.getValue(Action.NAME), action); } return commands.get(key); }
}</source>
Better way to set the selection
<source lang="java">
import javax.swing.JTextArea; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) { JTextComponent c = new JTextArea(); c.select(10, 20); }
}</source>
CaretListener Interface and CaretEvent Class
<source lang="java">
import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; public class CaretSample {
public static void main(String args[]) { JFrame frame = new JFrame("Caret Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextArea textArea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(textArea); frame.add(scrollPane, BorderLayout.CENTER); CaretListener listener = new CaretListener() { public void caretUpdate(CaretEvent caretEvent) { System.out.println("Dot: "+ caretEvent.getDot()); System.out.println("Mark: "+caretEvent.getMark()); } }; textArea.addCaretListener(listener); frame.setSize(250, 150); frame.setVisible(true); }
}</source>
Default Editor Kit: cutAction
<source lang="java">
import java.awt.BorderLayout; import java.util.Hashtable; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.text.DefaultEditorKit; public class CutPasteSample {
public static void main(String args[]) { JFrame frame = new JFrame("Cut/Paste Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextField textField = new JTextField(); frame.add(textField, BorderLayout.NORTH); Action actions[] = textField.getActions(); Action cutAction = findAction(actions, DefaultEditorKit.cutAction); Action copyAction = findAction(actions, DefaultEditorKit.copyAction); Action pasteAction = findAction(actions, DefaultEditorKit.pasteAction); JPanel panel = new JPanel(); frame.add(panel, BorderLayout.SOUTH); JButton cutButton = new JButton(cutAction); cutButton.setText("Cut"); panel.add(cutButton); JButton copyButton = new JButton(copyAction); copyButton.setText("Copy"); panel.add(copyButton); JButton pasteButton = new JButton(pasteAction); pasteButton.setText("Paste"); panel.add(pasteButton); frame.setSize(250, 250); frame.setVisible(true); } private static Action findAction(Action actions[], String key) { Hashtable<Object, Action> commands = new Hashtable<Object, Action>(); for (int i = 0; i < actions.length; i++) { Action action = actions[i]; commands.put(action.getValue(Action.NAME), action); } return commands.get(key); }
}</source>
Document and DocumentFilter
<source lang="java">
import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; public class MainClass {
public static void main(String[] args) throws Exception { JTextField field = new JTextField(30); ((AbstractDocument) (field.getDocument())).setDocumentFilter(new DocumentFilter() { public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { System.out.println("insert"); fb.insertString(offset, string.toUpperCase(), attr); } public void replace(FilterBypass fb, int offset, int length, String string, AttributeSet attr) throws BadLocationException { System.out.println("replace"); fb.replace(offset, length, string.toUpperCase(), attr); } }); JFrame frame = new JFrame("User Information"); frame.getContentPane().add(field); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }
}</source>
Drawing in the Background of a Component
<source lang="java">
import java.awt.BorderLayout; import java.awt.Graphics; import java.awt.Image; import javax.swing.GrayFilter; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class JTextAreaBackgroundSample {
public static void main(String args[]) { JFrame frame = new JFrame("Background Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final ImageIcon imageIcon = new ImageIcon("yourFile.gif"); JTextArea textArea = new JTextArea() { Image image = imageIcon.getImage(); Image grayImage = GrayFilter.createDisabledImage(image); { setOpaque(false); } public void paint(Graphics g) { g.drawImage(grayImage, 0, 0, this); super.paint(g); } }; JScrollPane scrollPane = new JScrollPane(textArea); frame.add(scrollPane, BorderLayout.CENTER); frame.setSize(250, 250); frame.setVisible(true); }
}</source>
Enabling Text-Dragging on a JTextComponent
<source lang="java">
import javax.swing.JTextArea; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) throws Exception { JTextComponent textComp = new JTextArea(); textComp.setDragEnabled(true); }
}</source>
Enumerating All the Views in a JTextComponent
<source lang="java">
import javax.swing.JTextPane; import javax.swing.text.JTextComponent; import javax.swing.text.View; public class Main {
public static void main(String[] argv) { JTextComponent textComp = new JTextPane(); View v = textComp.getUI().getRootView(textComp); walkView(v, 0); } public static void walkView(View view, int level) { int n = view.getViewCount(); for (int i = 0; i < n; i++) { walkView(view.getView(i), level + 1); } }
}</source>
Filter all editing operations on a text component
<source lang="java">
import javax.swing.JTextField; import javax.swing.text.AbstractDocument; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DocumentFilter; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) { JTextComponent textComponent = new JTextField(); AbstractDocument doc = (AbstractDocument) textComponent.getDocument(); doc.setDocumentFilter(new FixedSizeFilter(10)); }
} class FixedSizeFilter extends DocumentFilter {
int maxSize; public FixedSizeFilter(int limit) { maxSize = limit; } public void insertString(DocumentFilter.FilterBypass fb, int offset, String str, AttributeSet attr) throws BadLocationException { replace(fb, offset, 0, str, attr); } public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String str, AttributeSet attrs) throws BadLocationException { int newLength = fb.getDocument().getLength() - length + str.length(); if (newLength <= maxSize) { fb.replace(offset, length, str, attrs); } else { throw new BadLocationException("New characters exceeds max size of document", offset); } }
}</source>
GIF Writer
<source lang="java">
import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class ImageConverterGIF {
public static void main(String[] args) throws Exception { String imageFilePath = "C:/myBmp.bmp"; String gifFilePath = "C:/myPic.gif"; File inputFile = new File(imageFilePath); BufferedImage image = ImageIO.read(inputFile); File outputFile = new File(gifFilePath); ImageIO.write(image, "GIF", outputFile); }
}</source>
Highlight a word in JTextComponent
<source lang="java">
import java.awt.Color; import javax.swing.JTextArea; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultHighlighter; import javax.swing.text.Document; import javax.swing.text.Highlighter; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) throws Exception { JTextArea textComp = new JTextArea(); Highlighter hilite = textComp.getHighlighter(); Highlighter.Highlight[] hilites = hilite.getHighlights(); for (int i = 0; i < hilites.length; i++) { if (hilites[i].getPainter() instanceof MyHighlightPainter) { hilite.removeHighlight(hilites[i]); } } highlight(textComp); } public static void highlight(JTextComponent textComp) { try { Highlighter hilite = textComp.getHighlighter(); Document doc = textComp.getDocument(); hilite.addHighlight(3, 5, new MyHighlightPainter(Color.red)); } catch (BadLocationException e) { e.printStackTrace(); } }
} class MyHighlightPainter extends DefaultHighlighter.DefaultHighlightPainter {
public MyHighlightPainter(Color color) { super(color); }
}</source>
JTextComponent: the parent class for all the components used as textual views.
- JTextComponent describes the common behavior shared by all text components:
- a Highlighter for selection support,
- a Caret for navigation throughout the content,
- a set of commands supported through the actions property (an array of Action implementers),
- a set of key bindings through a Keymap or InputMap/ActionMap combination,
- an implementation of the Scrollable interface so that each of the specific text components can be placed within a JScrollPane, and the text stored within the component.
Limiting the Capacity of a JTextComponent
<source lang="java">
import javax.swing.JTextField; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.JTextComponent; import javax.swing.text.PlainDocument; public class Main {
public static void main(String[] argv) { JTextComponent textComp = new JTextField(); textComp.setDocument(new FixedSizePlainDocument(10)); }
} class FixedSizePlainDocument extends PlainDocument {
int maxSize; public FixedSizePlainDocument(int limit) { maxSize = limit; } public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { if ((getLength() + str.length()) <= maxSize) { super.insertString(offs, str, a); } else { throw new BadLocationException("Insertion exceeds max size of document", offs); } }
}</source>
Listening for Caret Movement Events in a JTextComponent
<source lang="java">
import javax.swing.JTextArea; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) { JTextComponent textComp = new JTextArea(); textComp.addCaretListener(new CaretListener() { public void caretUpdate(CaretEvent e) { int dot = e.getDot(); System.out.println("dot is the caret position:" + dot); int mark = e.getMark(); System.out.println("mark is the non-caret end of the selection: " + mark); } }); }
}</source>
Listening for Editing Changes in a JTextComponent
<source lang="java">
import javax.swing.JTextPane; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) throws Exception { JTextComponent textcomp = new JTextPane(); textcomp.setText("Initial Text"); textcomp.getDocument().addDocumentListener(new DocumentListener() { public void insertUpdate(DocumentEvent evt) { int off = evt.getOffset(); System.out.println("off:"+off); int len = evt.getLength(); System.out.println("len:"+len); try { String str = evt.getDocument().getText(off, len); System.out.println(str); } catch (BadLocationException e) { } } public void removeUpdate(DocumentEvent evt) { int off = evt.getOffset(); System.out.println("off:"+off); int len = evt.getLength(); System.out.println("len:"+len); } public void changedUpdate(DocumentEvent evt) { int off = evt.getOffset(); System.out.println("off:"+off); int len = evt.getLength(); System.out.println("len:"+len); } }); }
}</source>
Listening to JTextField Events with an KeyListener
<source lang="java">
import java.awt.BorderLayout; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JTextField; public class AddingActionCommandActionListenerSample {
public static void main(String args[]) { JFrame frame = new JFrame("Default Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextField textField = new JTextField(); frame.add(textField, BorderLayout.NORTH); KeyListener keyListener = new KeyListener() { public void keyPressed(KeyEvent keyEvent) { printIt("Pressed", keyEvent); } public void keyReleased(KeyEvent keyEvent) { printIt("Released", keyEvent); } public void keyTyped(KeyEvent keyEvent) { printIt("Typed", keyEvent); } private void printIt(String title, KeyEvent keyEvent) { int keyCode = keyEvent.getKeyCode(); String keyText = KeyEvent.getKeyText(keyCode); System.out.println(title + " : " + keyText); } }; textField.addKeyListener(keyListener); textField.addKeyListener(keyListener); frame.setSize(250, 150); frame.setVisible(true); }
}</source>
Listening to Text Components Events with a DocumentListener
<source lang="java">
import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.Document; public class AddingDocumentListenerJTextFieldSample {
public static void main(String args[]) { final JFrame frame = new JFrame("Default Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextField textField = new JTextField(); frame.add(textField, BorderLayout.NORTH); DocumentListener documentListener = new DocumentListener() { public void changedUpdate(DocumentEvent documentEvent) { printIt(documentEvent); } public void insertUpdate(DocumentEvent documentEvent) { printIt(documentEvent); } public void removeUpdate(DocumentEvent documentEvent) { printIt(documentEvent); } private void printIt(DocumentEvent documentEvent) { DocumentEvent.EventType type = documentEvent.getType(); String typeString = null; if (type.equals(DocumentEvent.EventType.CHANGE)) { typeString = "Change"; } else if (type.equals(DocumentEvent.EventType.INSERT)) { typeString = "Insert"; } else if (type.equals(DocumentEvent.EventType.REMOVE)) { typeString = "Remove"; } System.out.print("Type : " + typeString); Document source = documentEvent.getDocument(); int length = source.getLength(); System.out.println("Length: " + length); } }; textField.getDocument().addDocumentListener(documentListener); frame.setSize(250, 150); frame.setVisible(true); }
}</source>
Listening to Text Components Events with an ActionListener
<source lang="java">
import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JTextField; public class AddingActionCommandActionListenerSample {
public static void main(String args[]) { JFrame frame = new JFrame("Default Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextField textField = new JTextField(); frame.add(textField, BorderLayout.NORTH); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { System.out.println("Command: " + actionEvent.getActionCommand()); } }; textField.setActionCommand("Yo"); textField.addActionListener(actionListener); frame.setSize(250, 150); frame.setVisible(true); }
}</source>
Listening to Text Components Events with an InputVerifier
Do field-level validation of a JTextField. Before focus moves out of a text component, the verifier runs. If not valid, the verifier rejects the change and keeps input focus within the given component.
<source lang="java">
import java.awt.BorderLayout; import javax.swing.InputVerifier; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JTextField; import javax.swing.text.JTextComponent; public class AddingActionCommandActionListenerSample {
public static void main(String args[]) { final JFrame frame = new JFrame("Default Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextField textField = new JTextField(); frame.add(textField, BorderLayout.NORTH); frame.add(new JTextField(), BorderLayout.SOUTH); InputVerifier verifier = new InputVerifier() { public boolean verify(JComponent input) { final JTextComponent source = (JTextComponent)input; String text = source.getText(); if ((text.length() != 0) && !(text.equals("Exit"))) { JOptionPane.showMessageDialog (frame, "Can"t leave.", "Error Dialog", JOptionPane.ERROR_MESSAGE); return false; } else { return true; } } }; textField.setInputVerifier(verifier); frame.setSize(250, 150); frame.setVisible(true); }
}</source>
Loading and Saving Content
<source lang="java">
import java.awt.BorderLayout; import java.awt.event.KeyEvent; import java.io.FileReader; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class LabelSampleLoadText {
public static void main(String args[]) { JFrame frame = new JFrame("Label Focus Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(new BorderLayout()); JLabel label = new JLabel("Name: "); label.setDisplayedMnemonic(KeyEvent.VK_N); JTextField textField = new JTextField(); label.setLabelFor(textField); panel.add(label, BorderLayout.WEST); panel.add(textField, BorderLayout.CENTER); frame.add(panel, BorderLayout.NORTH); frame.add(new JButton("Somewhere Else"), BorderLayout.SOUTH); frame.setSize(250, 150); frame.setVisible(true); FileReader reader = null; try { String filename = "test.txt"; reader = new FileReader(filename); textField.read(reader, filename); } catch (IOException exception) { System.err.println("Load oops"); } finally { if (reader != null) { try { reader.close(); } catch (IOException exception) { System.err.println("Error closing reader"); exception.printStackTrace(); } } } }
}</source>
Modifying Text in a JTextComponent: Append some text
<source lang="java">
import javax.swing.JTextField; import javax.swing.text.Document; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) throws Exception { JTextComponent textComp = new JTextField("Initial Text"); Document doc = textComp.getDocument(); // Append some text doc.insertString(doc.getLength(), "some text", null); }
}</source>
Modifying Text in a JTextComponent: Delete the first 5 characters
<source lang="java">
import javax.swing.JTextField; import javax.swing.text.Document; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) throws Exception { JTextComponent textComp = new JTextField("Initial Text"); Document doc = textComp.getDocument(); // Delete the first 5 characters int pos = 0; int len = 5; doc.remove(pos, len); }
}</source>
Modifying Text in a JTextComponent: Insert some text after the 5th character
<source lang="java">
import javax.swing.JTextField; import javax.swing.text.Document; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) throws Exception { JTextComponent textComp = new JTextField("Initial Text"); Document doc = textComp.getDocument(); // Insert some text after the 5th character int pos = 5; doc.insertString(pos, "some text", null); }
}</source>
Modifying Text in a JTextComponent: Insert some text at the beginning
<source lang="java">
import javax.swing.JTextField; import javax.swing.text.Document; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) throws Exception { JTextComponent textComp = new JTextField("Initial Text"); Document doc = textComp.getDocument(); // Insert some text at the beginning int pos = 0; doc.insertString(pos, "some text", null); }
}</source>
Modifying Text in a JTextComponent: Replace the first 3 characters with some text
<source lang="java">
import javax.swing.JTextField; import javax.swing.text.Document; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) throws Exception { JTextComponent textComp = new JTextField("Initial Text"); Document doc = textComp.getDocument(); // Replace the first 3 characters with some text int pos = 0; int len = 3; doc.remove(pos, len); doc.insertString(pos, "new text", null); }
}</source>
Moving the Caret of a JTextComponent
<source lang="java">
import java.awt.Color; import javax.swing.JTextArea; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) throws Exception { JTextComponent c = new JTextArea(); c.getCaretPosition(); if (c.getCaretPosition() < c.getDocument().getLength()) { char ch = c.getText(c.getCaretPosition(), 1).charAt(0); } // Move the caret int newPosition = 0; c.moveCaretPosition(newPosition); }
}</source>
Overriding the Default Action of a JTextComponent
<source lang="java">
import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JTextArea; import javax.swing.text.JTextComponent; import javax.swing.text.Keymap; public class Main {
public static void main(String[] argv) throws Exception { JTextArea component = new JTextArea(); Action defAction = findDefaultAction(component); component.getKeymap().setDefaultAction(new MyDefaultAction(defAction)); } public static Action findDefaultAction(JTextComponent c) { Keymap kmap = c.getKeymap(); if (kmap.getDefaultAction() != null) { return kmap.getDefaultAction(); } kmap = kmap.getResolveParent(); while (kmap != null) { if (kmap.getDefaultAction() != null) { return kmap.getDefaultAction(); } kmap = kmap.getResolveParent(); } return null; }
} class MyDefaultAction extends AbstractAction {
Action defAction; public MyDefaultAction(Action a) { super("My Default Action"); defAction = a; } public void actionPerformed(ActionEvent e) { if (e.getActionCommand() != null) { String command = e.getActionCommand(); if (command != null) { command = command.toUpperCase(); } e = new ActionEvent(e.getSource(), e.getID(), command, e.getModifiers()); } if (defAction != null) { defAction.actionPerformed(e); } }
}</source>
Register Keyboard action: registerKeyboardAction
<source lang="java">
import java.awt.BorderLayout; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.text.BadLocationException; public class PopupSample {
public static void main(String args[]) { JFrame frame = new JFrame("Popup Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JPopupMenu popup = new JPopupMenu(); JMenuItem menuItem1 = new JMenuItem("Option 1"); popup.add(menuItem1); JMenuItem menuItem2 = new JMenuItem("Option 2"); popup.add(menuItem2); final JTextField textField = new JTextField(); frame.add(textField, BorderLayout.NORTH); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { try { int dotPosition = textField.getCaretPosition(); Rectangle popupLocation = textField.modelToView(dotPosition); popup.show(textField, popupLocation.x, popupLocation.y); } catch (BadLocationException badLocationException) { System.err.println("Oops"); } } }; KeyStroke keystroke = KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, 0, false); textField.registerKeyboardAction(actionListener, keystroke, JComponent.WHEN_FOCUSED); frame.add(new JLabel("Press "." to activate Popup menu"), BorderLayout.SOUTH); frame.setSize(250, 150); frame.setVisible(true); }
}</source>
Remove Highlighting in a JTextComponent
<source lang="java">
import java.awt.Color; import javax.swing.JTextArea; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultHighlighter; import javax.swing.text.Document; import javax.swing.text.Highlighter; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) throws Exception { JTextArea textComp = new JTextArea(); removeHighlights(textComp); } public static void removeHighlights(JTextComponent textComp) { Highlighter hilite = textComp.getHighlighter(); Highlighter.Highlight[] hilites = hilite.getHighlights(); for (int i = 0; i < hilites.length; i++) { if (hilites[i].getPainter() instanceof MyHighlightPainter) { hilite.removeHighlight(hilites[i]); } } }
}</source>
Remove Key action from Text component
<source lang="java">
import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.text.Keymap; public class DefaultSample {
public static void main(String args[]) { JFrame frame = new JFrame("Default Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextField textField = new JTextField(); frame.add(textField, BorderLayout.NORTH); ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { System.out.println(actionEvent.getActionCommand() + " selected"); } }; JPanel panel = new JPanel(); JButton defaultButton = new JButton("Default Button"); defaultButton.addActionListener(actionListener); panel.add(defaultButton); JButton otherButton = new JButton("Other Button"); otherButton.addActionListener(actionListener); panel.add(otherButton); frame.add(panel, BorderLayout.SOUTH); Keymap keymap = textField.getKeymap(); KeyStroke keystroke = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false); keymap.removeKeyStrokeBinding(keystroke); frame.getRootPane().setDefaultButton(defaultButton); frame.setSize(250, 150); frame.setVisible(true); }
}</source>
<source lang="java">
import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.text.NavigationFilter; import javax.swing.text.Position; public class NavigationSample {
public static void main(String args[]) { JFrame frame = new JFrame("Navigation Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTextArea textArea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(textArea); frame.add(scrollPane, BorderLayout.CENTER); NavigationFilter filter = new NavigationFilter() { public void setDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) { System.out.println("Setting: " + dot); fb.setDot(dot, bias); } public void moveDot(NavigationFilter.FilterBypass fb, int dot, Position.Bias bias) { System.out.println("Moving: " + dot); fb.setDot(dot, bias); } }; textArea.setNavigationFilter(filter); frame.setSize(250, 150); frame.setVisible(true); }
}</source>
Set the caret color
<source lang="java">
import java.awt.Color; import javax.swing.JTextArea; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) throws Exception { JTextComponent c = new JTextArea(); c.getCaretPosition(); if (c.getCaretPosition() < c.getDocument().getLength()) { char ch = c.getText(c.getCaretPosition(), 1).charAt(0); } // Set the caret color c.setCaretColor(Color.red); }
}</source>
Set the color behind the selected text
<source lang="java">
import java.awt.Color; import javax.swing.JTextArea; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) { JTextComponent c = new JTextArea(); c.setSelectionColor(Color.green); }
}</source>
Setting the Blink Rate of a JTextComponent"s Caret
<source lang="java">
import javax.swing.JTextArea; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) { JTextComponent c = new JTextArea(); // Set rate to blink once a second c.getCaret().setBlinkRate(1000); // Set the caret to stop blinking c.getCaret().setBlinkRate(0); }
}</source>
<source lang="java">
import java.awt.Container; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class SharedModel {
public static void main(String[] args) { JFrame frame = new JFrame("Shared Model"); JTextArea areaFiftyOne = new JTextArea(); JTextArea areaFiftyTwo = new JTextArea(); areaFiftyTwo.setDocument(areaFiftyOne.getDocument()); JTextArea areaFiftyThree = new JTextArea(); areaFiftyThree.setDocument(areaFiftyOne.getDocument()); frame.setLayout(new GridLayout(3, 1)); frame.add(new JScrollPane(areaFiftyOne)); frame.add(new JScrollPane(areaFiftyTwo)); frame.add(new JScrollPane(areaFiftyThree)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 300); frame.setVisible(true); }
}</source>
Sharing a Document Between JTextComponents
<source lang="java">
import javax.swing.JTextArea; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) { JTextComponent textComp1 = new JTextArea(); JTextComponent textComp2 = new JTextArea(); textComp2.setDocument(textComp1.getDocument()); }
}</source>
TextAction Name Constants
- DefaultEditorKit.backwardAction
- DefaultEditorKit.previousWordAction
- DefaultEditorKit.beepAction
- DefaultEditorKit.readOnlyAction
- DefaultEditorKit.beginAction
- DefaultEditorKit.selectAllAction
- DefaultEditorKit.beginLineAction
- DefaultEditorKit.selectionBackwardAction
- DefaultEditorKit.beginParagraphAction
- DefaultEditorKit.selectionBeginAction
- DefaultEditorKit.beginWordAction
- DefaultEditorKit.selectionBeginLineAction
- DefaultEditorKit.copyAction
- DefaultEditorKit.selectionBeginParagraphAction
- DefaultEditorKit.cutAction
- DefaultEditorKit.selectionBeginWordAction
- DefaultEditorKit.defaultKeyTypedAction
- DefaultEditorKit.selectionDownAction
- DefaultEditorKit.deleteNextCharAction
- DefaultEditorKit.selectionEndAction
- DefaultEditorKit.deletePrevCharAction
- DefaultEditorKit.selectionEndLineAction
- DefaultEditorKit.downAction
- DefaultEditorKit.selectionEndParagraphAction
- DefaultEditorKit.endAction
- DefaultEditorKit.selectionEndWordAction
- DefaultEditorKit.endLineAction
- DefaultEditorKit.selectionForwardAction
- DefaultEditorKit.endParagraphAction
- DefaultEditorKit.selectionNextWordAction
- DefaultEditorKit.endWordAction
- DefaultEditorKit.selectionPreviousWordAction
- DefaultEditorKit.forwardAction
- DefaultEditorKit.selectionUpAction
- DefaultEditorKit.insertBreakAction
- DefaultEditorKit.selectLineAction
- DefaultEditorKit.insertContentAction
- DefaultEditorKit.selectParagraphAction
- DefaultEditorKit.insertTabAction
- DefaultEditorKit.selectWordAction
- DefaultEditorKit.nextWordAction
- DefaultEditorKit.upAction
- DefaultEditorKit.pageDownAction
- DefaultEditorKit.writableAction
- DefaultEditorKit.pageUpAction
- JTextField.notifyAction
- DefaultEditorKit.pasteAction
Text Component Printing
<source lang="java">
import java.awt.BorderLayout; import java.text.MessageFormat; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class TextComponentDemo {
public static void main(String[] args) throws Exception { final JTextArea textArea = new JTextArea(); textArea.setText("text"); JScrollPane jScrollPane = new JScrollPane(textArea); final MessageFormat header = new MessageFormat("My Header"); final MessageFormat footer = new MessageFormat("My Footer"); JPanel contentPane = new JPanel(); contentPane.setLayout(new BorderLayout()); contentPane.add(jScrollPane, BorderLayout.CENTER); JFrame frame = new JFrame(); frame.setTitle("Text-component Printing Demo"); frame.setSize(400, 200); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(contentPane); frame.setVisible(true); textArea.print(header, footer, true, null, null, true); }
}</source>
Text component supports both cut, copy and paste (using the DefaultEditorKit"s built-in actions) and drag and drop
<source lang="java">
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Sun Microsystems nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
/**
* TextCutPaste.java requires the following file: * TextTransferHandler.java */
import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.KeyEvent; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.TransferHandler; import javax.swing.UIManager; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultEditorKit; import javax.swing.text.Document; import javax.swing.text.JTextComponent; import javax.swing.text.Position; /**
* Example code that shows a text component that supports both cut, copy and * paste (using the DefaultEditorKit"s built-in actions) and drag and drop. */
public class TextCutPaste extends JPanel {
TextTransferHandler th; public TextCutPaste() { super(new BorderLayout()); setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // Create the transfer handler. TextTransferHandler th = new TextTransferHandler(); // Create some text fields. JPanel buttonPanel = new JPanel(new GridLayout(3, 1)); JTextField textField = new JTextField("Cut, copy and paste...", 30); textField.setTransferHandler(th); textField.setDragEnabled(true); buttonPanel.add(textField); textField = new JTextField("or drag and drop...", 30); textField.setTransferHandler(th); textField.setDragEnabled(true); buttonPanel.add(textField); textField = new JTextField("from any of these text fields.", 30); textField.setTransferHandler(th); textField.setDragEnabled(true); buttonPanel.add(textField); add(buttonPanel, BorderLayout.CENTER); } /** * Create an Edit menu to support cut/copy/paste. */ public JMenuBar createMenuBar() { JMenuItem menuItem = null; JMenuBar menuBar = new JMenuBar(); JMenu mainMenu = new JMenu("Edit"); mainMenu.setMnemonic(KeyEvent.VK_E); menuItem = new JMenuItem(new DefaultEditorKit.CutAction()); menuItem.setText("Cut"); menuItem.setMnemonic(KeyEvent.VK_T); mainMenu.add(menuItem); menuItem = new JMenuItem(new DefaultEditorKit.CopyAction()); menuItem.setText("Copy"); menuItem.setMnemonic(KeyEvent.VK_C); mainMenu.add(menuItem); menuItem = new JMenuItem(new DefaultEditorKit.PasteAction()); menuItem.setText("Paste"); menuItem.setMnemonic(KeyEvent.VK_P); mainMenu.add(menuItem); menuBar.add(mainMenu); return menuBar; } /** * Create the GUI and show it. For thread safety, this method should be * invoked from the event-dispatching thread. */ private static void createAndShowGUI() { // Create and set up the window. JFrame frame = new JFrame("TextCutPaste"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Create and set up the menu bar and content pane. TextCutPaste demo = new TextCutPaste(); frame.setJMenuBar(demo.createMenuBar()); demo.setOpaque(true); // content panes must be opaque frame.setContentPane(demo); // Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { // Schedule a job for the event-dispatching thread: // creating and showing this application"s GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { // Turn off metal"s use of bold fonts UIManager.put("swing.boldMetal", Boolean.FALSE); createAndShowGUI(); } }); }
} /*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name of Sun Microsystems nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */
/**
* TextTransferHandler.java is used by the TextCutPaste.java example. */
/**
* An implementation of TransferHandler that adds support for the import and * export of text using drag and drop and cut/copy/paste. */
class TextTransferHandler extends TransferHandler {
// Start and end position in the source text. // We need this information when performing a MOVE // in order to remove the dragged text from the source. Position p0 = null, p1 = null; /** * Perform the actual import. This method supports both drag and drop and * cut/copy/paste. */ public boolean importData(TransferHandler.TransferSupport support) { // If we can"t handle the import, bail now. if (!canImport(support)) { return false; } // Fetch the data -- bail if this fails String data; try { data = (String) support.getTransferable().getTransferData( DataFlavor.stringFlavor); } catch (UnsupportedFlavorException e) { return false; } catch (java.io.IOException e) { return false; } JTextField tc = (JTextField) support.getComponent(); tc.replaceSelection(data); return true; } /** * Bundle up the data for export. */ protected Transferable createTransferable(JComponent c) { JTextField source = (JTextField) c; int start = source.getSelectionStart(); int end = source.getSelectionEnd(); Document doc = source.getDocument(); if (start == end) { return null; } try { p0 = doc.createPosition(start); p1 = doc.createPosition(end); } catch (BadLocationException e) { System.out .println("Can"t create position - unable to remove text from source."); } String data = source.getSelectedText(); return new StringSelection(data); } /** * These text fields handle both copy and move actions. */ public int getSourceActions(JComponent c) { return COPY_OR_MOVE; } /** * When the export is complete, remove the old text if the action was a move. */ protected void exportDone(JComponent c, Transferable data, int action) { if (action != MOVE) { return; } if ((p0 != null) && (p1 != null) && (p0.getOffset() != p1.getOffset())) { try { JTextComponent tc = (JTextComponent) c; tc.getDocument() .remove(p0.getOffset(), p1.getOffset() - p0.getOffset()); } catch (BadLocationException e) { System.out.println("Can"t remove text from source."); } } } /** * We only support importing strings. */ public boolean canImport(TransferHandler.TransferSupport support) { // we only import Strings if (!support.isDataFlavorSupported(DataFlavor.stringFlavor)) { return false; } return true; }
}</source>
Using Text Component Actions
<source lang="java">
import java.awt.BorderLayout; import javax.swing.Action; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; import javax.swing.text.DefaultEditorKit; public class UseActionsFromTextComponents {
public static void main(String args[]) { JFrame frame = new JFrame("Use TextAction"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JTextArea leftArea = new JTextArea(); final JTextArea rightArea = new JTextArea(); JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(leftArea), new JScrollPane(rightArea)); splitPane.setDividerLocation(.5); JMenuBar menuBar = new JMenuBar(); frame.setJMenuBar(menuBar); JMenu menu = new JMenu("Options"); menuBar.add(menu); JMenuItem menuItem; Action readAction = leftArea.getActionMap().get(DefaultEditorKit.readOnlyAction); menuItem = menu.add(readAction); menuItem.setText("Make read-only"); Action writeAction = leftArea.getActionMap().get(DefaultEditorKit.writableAction); menuItem = menu.add(writeAction); menuItem.setText("Make writable"); menu.addSeparator(); Action cutAction = leftArea.getActionMap().get(DefaultEditorKit.cutAction); menuItem = menu.add(cutAction); menuItem.setText("Cut"); Action copyAction = leftArea.getActionMap().get(DefaultEditorKit.copyAction); menuItem = menu.add(copyAction); menuItem.setText("Copy"); Action pasteAction = leftArea.getActionMap().get(DefaultEditorKit.pasteAction); menuItem = menu.add(pasteAction); menuItem.setText("Paste"); frame.add(splitPane, BorderLayout.CENTER); frame.setSize(400, 250); frame.setVisible(true); }
}</source>
Using the Selection of a JTextComponent
<source lang="java">
import javax.swing.JTextArea; import javax.swing.text.JTextComponent; public class Main {
public static void main(String[] argv) { JTextComponent c = new JTextArea(); // Get text inside selection c.getSelectedText(); }
}</source>