Хороший улов от @ dk89, но, увы, данные обходные пути не работают: JDK 7, по-видимому, все еще не предлагает ждать установки настраиваемого BreakIterator на JTextComponent;даже на GlyphView, где генерация BreakIterator является частной.И если мы вставим строку char по типу char, она все равно не будет работать: я полагаю, что последовательные прогоны текста с одинаковым стилем (AttributeSet) свернуты вместе.
Я потратил два дня, пытаясь создать пользовательскийEditorKit, как рекомендовано в другом месте, но он не работает хорошо (по крайней мере, с JDK 1.7.0_4) в качестве текста.
Я попробовал решение, данное на Как переносить текст, хранящийся в JTextPanes, которыйэто ячейки в JList и вариант, найденный по адресу http://www.experts -exchange.com / Программирование / Языки / Java / Q_20393892.html
Но я обнаружил, что breakViewбольше не вызывается, когда JTextPane меньше самого длинного слова в предложении.Так что это не работает вообще, когда есть только одно (длинное) слово.Это наш случай, когда мы показываем предоставленные пользователем идентичные строки идентификатора, часто без пробелов, в довольно маленьких местах.
Я наконец нашел простое решение, основанное на предложении в отчете об ошибке: действительно, вставкастрока char за char, но альтернативные стили!Таким образом, у нас столько сегментов, сколько у нас есть символов, и строка обернута в границы символов.До следующего «исправления ошибки»?
Фрагменты кода:
private JTextPane tp;
private SimpleAttributeSet sas = new SimpleAttributeSet();
tp= new JTextPane();
sas.addAttribute( "A", "C" ); // Arbitrary attribute names and value, not used actually
// Set the global attributes (italics, etc.)
tp.setParagraphAttributes(styleParagraphAttributes, true);
Document doc = tp.getDocument();
try
{
doc.remove(0, doc.getLength()); // Clear
for (int i = 0; i < textToDisplay.length(); i++)
{
doc.insertString(doc.getLength(), textToDisplay.substring(i, i+1),
// Change attribute every other char
i % 2 == 0 ? null : sas);
}
}
catch (BadLocationException ble)
{
log.warn("Cannot happen...", ble);
}
Как указывалось в ошибке, они должны были предоставить простой способ (возможно, какое-то свойство или некоторые инъекционные данные) длявернуться к старому поведению.