Извлечение части StyledDocument "первым в последнем" и сохранение макета
Хотя у меня было достаточно свободного времени, я столкнулся с проблемой, связанной с StyledDocument как частью JTextPane. Я хочу удалить первую часть текста, когда общий размер документа достигает значения x (10.000 в моем случае). Но так как важно сохранить макет, позвольте мне сначала показать вам, что происходит на изображении, после чего я опубликую источник.
На рисунке 1: Когда максимальная длина еще не достигнута, у меня нет горизонтальной полосы прокрутки
На изображении 2: при достижении максимальной длины в 10.000 символов и обрезке StyledDocument с помощью styleddoc.getDocument(). Remove(0, maxsize);
[Изображение 1]
(Мне очень жаль, но так как это мой первый вопрос, я не могу публиковать фотографии в качестве меры по защите от спама)
Как видите, внезапно появляется горизонтальная полоса прокрутки, моя компоновка полностью запутана, и ни при каких обстоятельствах текст не будет аккуратно разделен на несколько строк, если он не помещается, как это было до удаления.
Теперь вот мой источник. Пожалуйста, помогите мне найти гениальное решение этой проблемы.
public void publicTextPaneOutput(String sender, String receiver, int type, String message) {
int messagesize = 0;
StyledDocument styledDocument = (StyledDocument) publicText.getDocument();
Style defaultStyle = styledDocument.addStyle("Default Text", null);
Style nicknameStyle = styledDocument.addStyle("Personal Nickname", null);
StyleConstants.setBold(nicknameStyle, true);
StyleConstants.setForeground(nicknameStyle, Color.decode("#006400"));
Style chatterStyle = styledDocument.addStyle("Other Nickname", null);
StyleConstants.setBold(chatterStyle, true);
StyleConstants.setForeground(chatterStyle, Color.blue);
switch (type) {
case 1: {
messagesize += sender.length() + message.length() + 3;
publicTextPaneOverflowProtection(styledDocument, messagesize);
try {
if (sender.equals(nickname)) {
styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(sender).toString(), nicknameStyle);
} else {
styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(sender).toString(), chatterStyle);
}
styledDocument.insertString(styledDocument.getLength(), ": ", chatterStyle);
styledDocument.insertString(styledDocument.getLength(), message, defaultStyle);
styledDocument.insertString(styledDocument.getLength(), "\n", defaultStyle);
} catch (BadLocationException e) {
e.printStackTrace();
}
break;
}
case 2: {
messagesize += sender.length() + receiver.length() + message.length() + 7;
publicTextPaneOverflowProtection(styledDocument, messagesize);
try {
if (sender.equals(nickname)) {
styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(sender).toString(), nicknameStyle);
} else {
styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(sender).toString(), chatterStyle);
}
styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(" -> ").toString(), chatterStyle);
if (receiver.equals(nickname)) {
styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(receiver).toString(), nicknameStyle);
} else {
styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(receiver).toString(), chatterStyle);
}
styledDocument.insertString(styledDocument.getLength(), (new StringBuilder()).append(": ").toString(), chatterStyle);
styledDocument.insertString(styledDocument.getLength(), message, defaultStyle);
styledDocument.insertString(styledDocument.getLength(), "\n", defaultStyle);
} catch (BadLocationException e) {
e.printStackTrace();
}
break;
}
}
scroll();
}
private void publicTextPaneOverflowProtection (StyledDocument styledDocument, int messagesize)
{
if(styledDocument.getLength() + messagesize > 10000) {
try {
styledDocument.remove(0, messagesize);
} catch (BadLocationException e) {
}
}
}
public void scroll() {
StyledDocument styleddocument = (StyledDocument) publicText.getDocument();
publicText.setCaretPosition(styleddocument.getLength());
}
// this part is coded in the class itself
private JTextPane publicText;
private JScrollPane publicTextScrollPane;
//this is coded in the constructor of the class
publicText = new JTextPane();
publicTextScrollPane = new JScrollPane();
publicText.setEditable(false);
publicTextScrollPane.setViewportView(publicText);
Если кому-то понадобится дополнительный код определенной части моего проекта, пожалуйста, сообщите мне как можно скорее
Решение, которое я хочу получить, должно реализовать удаление текста в начале StyledDocument и держать в учете размещенные символы \n, даже если часть удалена. Я пробовал несколько вещей, даже чтобы использовать простой "Документ" вместо Стилизованного, но это не вариант, так как я планирую реализовать использование цветов и смайликов в моем chatapplet.
Каждого заранее благодарят за это! Я буду следить как можно больше.
С уважением, Стивен Кастерс
PS: Почему я удаляю части StyledDocument? Управление памятью, потому что это часть чат-апплета, который может использовать до 200 человек одновременно, и когда каждый говорит что-то каждые 10 секунд, через одну минуту у вас есть 1200 сообщений, которые будут использовать много памяти, когда это продолжается, скажем, 10 часов: 720 000 сообщений в качестве расчетной максимальной нагрузки. (наихудший сценарий (или наилучший вариант зависит от точки зрения))
1 ответ
В вашем вопросе много разных частей, но одна часть может быть довольно просто исправить. Похоже, ваша главная задача - как удалить строки из вашего документа. Кто-то реализовал DocumentListener, который обрабатывает этот аспект для вас. Проверьте LimitLinesDocumentListener. Эта страница ссылается на источник для класса, который также содержит примеры того, как удалить строки из вашего документа.