2013-09-29 5 views
0

Это довольно маленькая вещь, но она все равно будет аккуратной.Вставить вкладку в JTextPane после разрыва строки

В принципе, когда вы программируете, например, с Eclipse он автоматически вставляет вкладки в классе или в цикле for, поэтому вам не нужно выравнивать свой код после каждого повторения строки снова.

Возможно ли реализовать функцию «не использовать-на-пресс-вкладку-снова-для-выравнивания-после-линейного разрыва» в JTextPane или JEditorPane?

ответ

1

Вы можете использовать пользовательское DocumentFilter реализовать такое поведение:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.text.*; 

public class EndOfLineFilter extends DocumentFilter 
{ 
    @Override 
    public void replace(FilterBypass fb, final int offset, int length, String text, AttributeSet a) 
     throws BadLocationException 
    { 
     if (text.equals("\n")) 
      text = addWhiteSpace(fb, offset, text); 

     super.replace(fb, offset, length, text, a); 
    } 


    private String addWhiteSpace(FilterBypass fb, int offset, String text) throws BadLocationException 
    { 
     Document doc = fb.getDocument(); 
     Element rootElement = doc.getDefaultRootElement(); 
     int line = rootElement.getElementIndex(offset); 
     int i = rootElement.getElement(line).getStartOffset(); 
     StringBuilder whiteSpace = new StringBuilder(text); 

     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(10, 30); 
     AbstractDocument doc = (AbstractDocument)textArea.getDocument(); 
     doc.setDocumentFilter(new EndOfLineFilter()); 

     JFrame frame = new JFrame("SSCCE"); 
     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(); 
      } 
     }); 
    } 
} 

Прочитайте раздел из свинга учебника по Implementing a DocumentFilter для получения дополнительной информации.

+0

Вау, это так здорово, спасибо большое! Сначала я попытался каким-то образом задействовать клавишника, но это совсем не сработало. Извините, на это потребовалось столько времени, чтобы ответить. –

Смежные вопросы