javaswingjtextpanestyleddocument

Java Setting Indent Size on JTextPane


I want to set the size of a tab character, \t, in a JTextPane to be 4 spaces wide.

After Googling quite a bit I found some things that I will include here for what I have tried and maybe why they failed.

How do you set the tab size in a JEditorPane?

JTextPane is not a plain document.

Java JTextpane Tab Size

Eclipse raised some errors:

Type mismatch: cannot convert from javax.swing.text.AttributeSet to 
 javax.print.attribute.AttributeSet

and

The method setParagraphAttributes(javax.swing.text.AttributeSet, boolean) in the type JTextPane is not applicable for the 
 arguments (javax.print.attribute.AttributeSet, boolean)

http://www.java2s.com/Code/Java/Swing-JFC/TextPaneSample.htm

This page talks about styling with JTextPane. The code I adapted from it and made this:

MutableAttributeSet set = new SimpleAttributeSet(pane.getParagraphAttributes());
StyleConstants.setLeftIndent(set, 40);
StyleConstants.setRightIndent(set, 40);

Solution

  • I want to set the size of a tab character, \t, in a JTextPane to be 4 spaces wide.

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.text.*;
    import javax.swing.event.*;
    
    public class TextPaneTabs
    {
        public static void setTabs( final JTextPane textPane, int charactersPerTab)
        {
            FontMetrics fm = textPane.getFontMetrics( textPane.getFont() );
    //          int charWidth = fm.charWidth( 'w' );
            int charWidth = fm.charWidth( ' ' );
            int tabWidth = charWidth * charactersPerTab;
    //      int tabWidth = 100;
    
            TabStop[] tabs = new TabStop[5];
    
            for (int j = 0; j < tabs.length; j++)
            {
                int tab = j + 1;
                tabs[j] = new TabStop( tab * tabWidth );
            }
    
            TabSet tabSet = new TabSet(tabs);
            SimpleAttributeSet attributes = new SimpleAttributeSet();
            StyleConstants.setTabSet(attributes, tabSet);
            int length = textPane.getDocument().getLength();
            textPane.getStyledDocument().setParagraphAttributes(0, length, attributes, false);
        }
    
        private static void createAndShowUI()
        {
            JTextPane textPane = new JTextPane();
            textPane.setText("12345678\n\t1\t2\t3aaaaa\t4\t5\t6\t7\t8\n\t1\t2\t3\t4\t5\t6\t7\t8\n\t\t12345678");
            JScrollPane scrollPane = new JScrollPane( textPane );
            scrollPane.setPreferredSize( new Dimension(700, 100 ) );
    
            // Change the tab size to 4 characters
    
            setTabs( textPane, 4 );
    
            JFrame frame = new JFrame("SSCCE");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add( scrollPane );
            frame.setLocationByPlatform( true );
            frame.pack();
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }
    

    Of course when using the default Font of a JTextPane the width of a space is not very wide so the actual tab will not be that big.