tags:

views:

831

answers:

3

I want my JTextPane to insert spaces whenever I press Tab. Currently it inserts the tab character (ASCII 9).

Is there anyway to customize the tab policy of JTextPane (other than catching "tab-key" events and inserting the spaces myself seems an)?

A: 

As far as I know, you'd have to catch key events, as you say. Depending on usage, you might also get away with waiting until the input is submitted, and changing tabs to spaces at that time.

Paul Brinkley
A: 

You could try sub-classing DefaultStyledDocument and overriding insert to replace any tabs in the inserted elements with spaces. Then install your sub-class in JTextPane with setStyledDocument(). This may be more trouble than catching key events though.

Dave Ray
+2  A: 

You can set a javax.swing.text.Document on your JTextPane. The following example will give you an idea of what I mean :)

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;

public class Tester {

    public static void main(String[] args) {
     JTextPane textpane = new JTextPane();
     textpane.setDocument(new TabDocument());
     JFrame frame = new JFrame();
     frame.getContentPane().add(textpane);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setSize(new Dimension(200, 200));
     frame.setVisible(true);
    }

    static class TabDocument extends DefaultStyledDocument {
     @Override
     public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
      str = str.replaceAll("\t", " ");
      super.insertString(offs, str, a);
     }
    }
}

Define a DefaultStyleDocument to do the work. Then set the Document to your JTextPane.

Cheers Kai

Kai