代码之家  ›  专栏  ›  技术社区  ›  user2228462

Java-JTextPane中的自动缩进

  •  4
  • user2228462  · 技术社区  · 11 年前

    我正在用Java制作一个文本编辑器,除了自动缩进之外,我已经拥有了所需的一切。如果它们转到新行,我如何使缩进保持不变。我正在使用JTextPane作为编辑器窗口。

    基本上,如果用户输入新行,我希望新行与前一行一样缩进。

    以下是迄今为止我的缩进代码:

    注意:我的JTextPane是txt doc 部分是JTextPane的 DefaultStyledDocument();

    SimpleAttributeSet attributes = new SimpleAttributeSet();
    
    TabStop[] tabStops = new TabStop[3];
    tabStops[0] = new TabStop(25, TabStop.ALIGN_LEFT, TabStop.LEAD_DOTS);
    tabStops[1] = new TabStop(25, TabStop.ALIGN_LEFT, TabStop.LEAD_DOTS);
    tabStops[2] = new TabStop(25, TabStop.ALIGN_LEFT, TabStop.LEAD_DOTS);
    tabStops[2] = new TabStop(25, TabStop.ALIGN_LEFT, TabStop.LEAD_DOTS);
    
    
    TabSet tabSet = new TabSet(tabStops);
    StyleConstants.setTabSet(attributes, tabSet);
    doc.setParagraphAttributes(0, 0, attributes, false);
    
    1 回复  |  直到 11 年前
        1
  •  4
  •   camickr    11 年前

    使用文档筛选器:

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.text.*;
    
    public class NewLineFilter extends DocumentFilter
    {
        public void insertString(FilterBypass fb, int offs, String str, AttributeSet a)
            throws BadLocationException
        {
            if ("\n".equals(str))
                str = addWhiteSpace(fb.getDocument(), offs);
    
            super.insertString(fb, offs, str, a);
        }
    
        public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
            throws BadLocationException
        {
            if ("\n".equals(str))
                str = addWhiteSpace(fb.getDocument(), offs);
    
            super.replace(fb, offs, length, str, a);
        }
    
        private String addWhiteSpace(Document doc, int offset)
            throws BadLocationException
        {
            StringBuilder whiteSpace = new StringBuilder("\n");
            Element rootElement = doc.getDefaultRootElement();
            int line = rootElement.getElementIndex( offset );
            int i = rootElement.getElement(line).getStartOffset();
    
            while (true)
            {
                String temp = doc.getText(i, 1);
    
                if (temp.equals(" ") || temp.equals("\t"))
                {
                    whiteSpace.append(temp);
                    i++;
                }
                else
                    break;
            }
    
            return whiteSpace.toString();
        }
    
        private static void createAndShowUI()
        {
            JTextArea textArea = new JTextArea(5, 50);
            AbstractDocument doc = (AbstractDocument)textArea.getDocument();
            doc.setDocumentFilter( new NewLineFilter() );
    
            JFrame frame = new JFrame("NewLineFilter");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add( new JScrollPane(textArea) );
            frame.pack();
            frame.setLocationByPlatform( true );
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }
    

    阅读Swing教程中关于 Implementing a Document Filter 了解更多信息。