Я делаю текстовый редактор на 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);
4
user2228462 8 Апр 2013 в 01:14
Попробуйте вызвать doc.setParagraphAttributes (0, 1, attributes, false); для включения последнего абзаца Element
 – 
StanislavL
10 Май 2013 в 11:02

1 ответ

Лучший ответ

Используйте фильтр документов:

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 по Реализация фильтра документов для получения дополнительной информации.

4
camickr 8 Апр 2013 в 03:56
Извините, но я не могу это использовать - в моем JTextPane уже есть StyledDocument, и когда я добавляю фильтр, подсветка синтаксиса по какой-то причине перестает работать. Если вы можете чем-то помочь, пожалуйста.
 – 
user2228462
8 Апр 2013 в 05:51
Как работает подсветка синтаксиса? Он также использует DocumentFilter. В таком случае вы можете использовать несколько фильтров документов, используя подход, предложенный в Цепочка Фильтры документов. Другой вариант - расширить StyledDocument и переопределить метод insertString () базовым кодом, который я вам предоставил.
 – 
camickr
8 Апр 2013 в 06:00
Нет, он работает с помощью AttributeSets, CharacterAttributes, сравнивая подстроки, но в конечном итоге использует DefaultStyledDocument.
 – 
user2228462
8 Апр 2013 в 06:06
Да, я знаю, что он использует AttributeSets и т. Д. Но вам нужно каким-то образом инициировать процесс выделения всякий раз, когда вы добавляете / удаляете текст в документ. В любом случае мои два предложения сверху все еще в силе.
 – 
camickr
8 Апр 2013 в 06:46
1
Это не отвечает на вопрос. Почему вы устанавливаете документ вручную. Вы расширили DefaultStyledDocument и переопределили некоторые методы для выделения? Если да, то какие методы вы переопределили. Расширение DefaultStyledDocument не должно останавливать работу DocumentFilter.
 – 
camickr
8 Апр 2013 в 10:08