Хорошо, у меня следующая проблема, я пишу простой графический клиент чата с Java Swing Framework. Для отображения полученных сообщений я использую JTextPane
. У меня была проблема, что когда один пользователь отправляет сообщение из одного символа без пробелов, компонент JTextPane
не переносит строку. Я решил эту проблему с помощью следующего кода: теперь компонент JTextPane
не переносится только по границам слов, а также по любому символу, если длина не соответствует ширине компонента.
public class WrapEditorKit extends StyledEditorKit
{
ViewFactory defaultFactory;
public WrapEditorKit()
{
this.defaultFactory = new WrapColumnFactory();
}
public ViewFactory getViewFactory()
{
return this.defaultFactory;
}
}
class WrapLabelView extends LabelView
{
public WrapLabelView(Element element)
{
super(element);
}
public float getMinimumSpan(int axis)
{
switch(axis)
{
case View.X_AXIS:
{
return 0;
}
case View.Y_AXIS:
{
return super.getMinimumSpan(axis);
}
default:
{
throw new IllegalArgumentException("Invalid axis: " + axis);
}
}
}
}
class WrapColumnFactory implements ViewFactory
{
public View create(Element element)
{
String kind = element.getName();
if(null != kind)
{
if(kind.equals(AbstractDocument.ContentElementName))
{
return new WrapLabelView(element);
}
else if(kind.equals(AbstractDocument.ParagraphElementName))
{
return new ParagraphView(element);
}
else if(kind.equals(AbstractDocument.SectionElementName))
{
return new BoxView(element, View.Y_AXIS);
}
else if(kind.equals(StyleConstants.ComponentElementName))
{
return new ComponentView(element);
}
else if(kind.equals(StyleConstants.IconElementName))
{
return new IconView(element);
}
}
return new LabelView(element);
}
}
Я давно получил этот код с веб-страницы, у меня нет URL, он отлично работает для небольшой панели редактирования текста. Но когда я добавляю текст поверх Document
, как указано выше, он ничего не отображает, он работает, только если я набираю слова непосредственно на панели, но не когда я добавляю текст поверх метода класса Document
...
StyleContext msgPaneStyle = new StyleContext();
final DefaultStyledDocument msgPaneDocument = new DefaultStyledDocument(this.msgPaneStyle);
JTextPane msgPane = new JTextPane(msgPaneDocument);
msgPane.setEditorKit(new WrapEditorKit());
Если я добавлю текст сейчас, набрав ..
msgPaneDocument.insertString(msgPaneDocument.getLength(), text, null);
... это не работает (не отображает текст), без комплекта редактора это работает. Есть идеи или подсказки?
EDIT
Мне кажется, проблема в том, что мои пользовательские EditorKit
и StyledDocument
не работают одновременно ... Если я вставлю текст, набрав msgPane.setText(text)
, это сработает!