📄 liveparenmatcher.java
字号:
// LiveParenMatcher.java// Like ParenMatcher but continuously colors as the user edits the document.package jswing.ch22;import javax.swing.*;import javax.swing.text.*;import javax.swing.event.*;public class LiveParenMatcher extends ParenMatcher implements DocumentListener { public LiveParenMatcher() { super(); getDocument().addDocumentListener(this); } public void changedUpdate(DocumentEvent de) { // no insertion or deletion, so do nothing } public void insertUpdate(DocumentEvent de) { SwingUtilities.invokeLater(this); // will call run() } public void removeUpdate(DocumentEvent de) { SwingUtilities.invokeLater(this); // will call run() } public static void main(String[] args) { JFrame frame = new JFrame("LiveParenMatcher"); frame.setContentPane(new JScrollPane(new LiveParenMatcher())); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 200); frame.setVisible(true); } // ---- finished example from "The DocumentListener Interface" ---- // ---- begin example from "The DocumentEvent Interface" ---- // (method renamed to insertUpdate_2) public void insertUpdate_2(DocumentEvent de) { Document doc = de.getDocument(); int offset = de.getOffset(); int length = de.getLength(); String inserted = ""; try { inserted = doc.getText(offset, length); } catch (BadLocationException ble) { } for (int j=0; j < inserted.length(); j+=1) { char ch = inserted.charAt(j); if (ch == '(' || ch == '[' || ch == '{' || ch == ')' || ch == ']' || ch == '}' ) { SwingUtilities.invokeLater(this); // will call run() return; // no need to check further } } } // ---- begin example from "The Segment Class" ---- // (method renamed to insertUpdate_3) public void insertUpdate_3(DocumentEvent de) { Document doc = de.getDocument(); int offset = de.getOffset(); int length = de.getLength(); Segment seg = new Segment(); try { doc.getText(offset, length, seg); // text placed in Segment } catch (BadLocationException ble) { } // iterate through the Segment for (char ch = seg.first(); ch != seg.DONE; ch = seg.next()) if (ch == '(' || ch == '[' || ch == '{' || ch == ')' || ch == ']' || ch == '}' ) { SwingUtilities.invokeLater(this); // will call run() return; // no need to check further } } // ---- begin example from "The ElementIterator Class" ---- // (method renamed to removeUpdate_2) public void removeUpdate_2(DocumentEvent de) { // print some debugging information before matching the parens ElementIterator iter = new ElementIterator(de.getDocument()); for (Element elem = iter.first(); elem != null; elem = iter.next()) { DocumentEvent.ElementChange change = de.getChange(elem); if (change != null) { // null means there was no change in elem System.out.println("Element "+elem.getName() + " (depth " + iter.depth()+") changed its children: " + change.getChildrenRemoved().length+" children removed, " + change.getChildrenAdded().length+" children added.\n"); } } SwingUtilities.invokeLater(this); // will call run() }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -