2016-10-18 5 views
0

Когда JEditorPane, поддерживаемый HTMLEditorKit, содержит тег <br>, за которым следует пустая строка, эта строка не отображается правильно, и каретка обрабатывается неправильно. Рассмотрим этот пример кода:Swing HTMLEditorKit/JEditorPane не обрабатывает <br> и пустые строки правильно

import java.awt.*; 
import java.io.*; 

import javax.swing.*; 
import javax.swing.text.*; 
import javax.swing.text.html.*; 

public class HTMLEditorTest { 

    public static void main(String[] args) throws IOException, BadLocationException { 
     JFrame frame = new JFrame(); 

     Reader stringReader = new StringReader("test<br><p>a"); 
     HTMLEditorKit htmlKit = new HTMLEditorKit(); 
     HTMLDocument htmlDoc = (HTMLDocument) htmlKit.createDefaultDocument(); 
     htmlKit.read(stringReader, htmlDoc, 0); 
     JEditorPane editorPane = new JEditorPane(); 
     editorPane.setEditorKit(htmlKit); 
     editorPane.setDocument(htmlDoc); 

     frame.getContentPane().add(BorderLayout.CENTER, new JScrollPane(editorPane)); 
     frame.setBounds(100, 100, 500, 400); 
     frame.setVisible(true); 
    } 
} 

Пустая строка после <br> тега не отображается. Когда каретка расположена слева от «а» полукокса и стрелка вверх клавишу нажатой, каретка исчезает:

Перед нажатием кнопки «вверх»:

enter image description here

После нажатия кнопки «вверх»:

After pressing 'up'

Обратите внимание, что расстояние между «тестом» и «а» слишком мало, и каретка исчезла.

Если затем ввести текст, недостающая пустая строка становится видимым:

After pressing 'b'

Проблема, кажется, что пустая строка визуализируется с высотой 0px, и, таким образом, не видно, в том числе карет, если он находится на этой линии. После того, как линия имеет контент, это содержимое заставляет ненулевую высоту строки.

Знаете ли вы, что просто обходной путь/исправить эту проблему? Я считаю, что в худшем случае мне нужно написать own editor kit (см. Также here и here для индивидуальной упаковки строк в JEditorPane) и/или custom tag (также here).

+0

Спасибо, но это не проблема. Поскольку я использую явно HTMLEditorKit, API интерпретирует строку как HTML уже. Я оставил ' ...' для простоты. Это работает так же, если эти теги включены. –

ответ

0

Найдено решение, с использованием специального набора редактора:

public class MyEditorKit extends HTMLEditorKit { 

    private static final int MIN_HEIGHT_VIEWS = 10; 

    @Override 
    public ViewFactory getViewFactory() { 

     return new HTMLFactory() { 

      @Override 
      public View create(Element e) { 
       View v = super.create(e); 
       // Test for BRView must use String comparison, as the class is package-visible and not available to us 
       if ((v instanceof InlineView) && !v.getClass().getSimpleName().equals("BRView")) { 

        View v2 = new InlineView(e) { 

         @Override 
         public float getMaximumSpan(int axis) { 
          float result = super.getMaximumSpan(axis); 
          if (axis == Y_AXIS) { 
           result = Math.max(result, MIN_HEIGHT_VIEWS); 
          } 
          return result; 
         } 

         @Override 
         public float getMinimumSpan(int axis) { 
          float result = super.getMinimumSpan(axis); 
          if (axis == Y_AXIS) { 
           result = Math.max(result, MIN_HEIGHT_VIEWS); 
          } 
          return result; 
         } 

         @Override 
         public float getPreferredSpan(int axis) { 
          float result = super.getPreferredSpan(axis); 
          if (axis == Y_AXIS) { 
           result= Math.max(result, MIN_HEIGHT_VIEWS); 
          } 

          return result; 
         } 
        }; 

        v = v2; 
       } 

       return v; 
      } 
     }; 
    } 
} 

комплект редактор возвращает пользовательский HTMLFactory. Эта фабрика создает пользовательские объекты InlineView для элементов листа, где InlineView не может иметь высоту 0. Он всегда будет иметь хотя бы MIN_HEIGHT_VIEW, который я установил в 10 пикселей (хорошо работает с размерами шрифта по умолчанию). Исходная реализация имеет смысл при рендеринге HTML только для просмотра, поскольку пустая строка после тега <br> действительно должна быть проигнорирована. Но для редактирования пользователи ожидают увидеть каретку на следующей строке после вставки строки.

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

  • Нет связанных вопросов^_^