java left logo
java middle logo
java right logo
 

Home arrow Java SE Tips arrow javax.swing arrow How to implement bracket matcher
 
 
Main Menu
Home
Java Tutorials
Book Reviews
Java SE Tips
Java ME Tips
Java EE Tips
Other API Tips
Java Applications
Java Libraries
Java Games
Java Network
Java Forums
Java Blog




Most Visited Tips
Java SE Tips
Java ME Tips
Java EE Tips
Other API Tips
Java Applications
Java Libraries
Java Games
Book Reviews
Top Rated Tips
Java SE Tips
Java ME Tips
Java EE Tips
Other API Tips
Java Applications
Java Libraries
Java Games
Book Reviews


Statistics
Registered Users: 4088
Java SE Tips: 614
Java ME Tips: 202
Java EE Tips: 183
Other API Tips: 779
Java Applications: 298
Java Libraries: 209
Java Games: 16
Book Reviews:
 
 
 
How to implement bracket matcher E-mail
User Rating: / 13
PoorBest 

This Java tip illustrates a method of implementing a simple parenthesis matcher. Developer may use this tip in implementing IDEs of various languages. Developer may also add this as a functionality in their word editor.


Image

import javax.swing.*;
import javax.swing.text.*;
import java.awt.event.*;
import java.awt.Color;
import java.awt.BorderLayout;

public class ParenMatcher extends JTextPane implements Runnable {

  public static Color[] matchColor = Color.blue, Color.magenta, Color.green };
  public static Color badColor = Color.red;

  private AttributeSet[] matchAttrSet;
  private AttributeSet badAttrSet;

  public ParenMatcher() {
    // create an array of AttributeSets from the array of Colors
    StyleContext sc = StyleContext.getDefaultStyleContext();
    badAttrSet = sc.addAttribute(SimpleAttributeSet.EMPTY,
                          StyleConstants.Foreground, badColor);
    matchAttrSet = new AttributeSet[matchColor.length];
    for (int j=0; j < matchColor.length; j+=1)
      matchAttrSet[j= sc.addAttribute(SimpleAttributeSet.EMPTY,
                                 StyleConstants.Foreground, matchColor[j]);
  }
  
  // match and color the parens/brackets/braces
  public void run() {
    StyledDocument doc = getStyledDocument();
    String text = "";
    int len = doc.getLength();
    try {
      text = doc.getText(0, len);
    catch (BadLocationException ble) { }
    java.util.Stack stack = new java.util.Stack();
    for (int j=0; j < text.length(); j+=1) {
      char ch = text.charAt(j);
      if (ch == '(' || ch == '[' || ch == '{') {
        int depth = stack.size();
        stack.push(""+ch+j)// push a String containg the char and the offset
        AttributeSet aset = matchAttrSet[depth % matchAttrSet.length];
        doc.setCharacterAttributes(j, 1, aset, false);
      }
      if (ch == ')' || ch == ']' || ch == '}') {
        String peek = stack.empty() "." (String)stack.peek();
        if (matches(peek.charAt(0), ch)) { // does it match?
          stack.pop();
          int depth = stack.size();
          AttributeSet aset = matchAttrSet[depth % matchAttrSet.length];
          doc.setCharacterAttributes(j, 1, aset, false);
        }
        else // mismatch
          doc.setCharacterAttributes(j, 1, badAttrSet, false);
        }
      }
     }
     
     while (! stack.empty()) { // anything left in the stack is a mismatch
       String pop = (String)stack.pop();
       int offset = Integer.parseInt(pop.substring(1));
       doc.setCharacterAttributes(offset, 1, badAttrSet, false);
     }
  }

  // unset the foreground color (if any) whenever the user enters text
  // (if not for this, text entered after a paren would catch the paren's color)
  public void replaceSelection(String content) {
    getInputAttributes().removeAttribute(StyleConstants.Foreground);
    super.replaceSelection(content);
  }

  // return true if 'left' and 'right' are matching parens/brackets/braces
  public static boolean matches(char left, char right) {
    if (left == '('return (right == ')');
    if (left == '['return (right == ']');
    if (left == '{'return (right == '}');
    return false;
  }

  public static void main(String[] args) {
    JFrame frame = new JFrame("ParenMatcher");

    final ParenMatcher matcher = new ParenMatcher();
    matcher.setText("int fact(int n) {\n"
                   +"  if (n <= 1) return 1;\n"
                   +"  return(n * fact(n-1));\n"
                   +"}\n");
    frame.getContentPane().add(new JScrollPane(matcher), BorderLayout.CENTER);

    JButton matchButton = new JButton("match parens");
    matchButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ae) { matcher.run()}
    });
    frame.getContentPane().add(matchButton, BorderLayout.SOUTH);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200150);
    frame.setVisible(true);
  }
}

 Related Tips

 
< Prev   Next >

Page 1 of 0 ( 0 comments )

You can share your information about this topic using the form below!

Please do not post your questions with this form! Thanks.


Name (required)


E-Mail (required)

Your email will not be displayed on the site - only to our administrator
Homepage(optional)



Comment Enable HTML code : Yes No



 
       
         
     
 
 
 
   
 
 
java bottom left
java bottom middle
java bottom right
RSS 0.91 FeedRSS 1.0 FeedRSS 2.0 FeedATOM FeedOPML Feed

Home - About Us - Privacy Policy
Copyright 2005 - 2008 www.java-tips.org
Java is a trademark of Sun Microsystems, Inc.