gpt4 book ai didi

java - 删除 StyledDocument 先进后出的一部分并保留布局

转载 作者:太空宇宙 更新时间:2023-11-04 07:57:33 25 4
gpt4 key购买 nike

虽然有相当多的空闲时间可以使用,但我遇到了有关将 StyledDocument 作为 JTextPane 一部分的问题。当文档的总大小达到值 x (在我的例子中为 10.000)时,我想删除文本的第一部分。但由于保留布局很重要,所以让我先向您展示图像中发生的情况,然后我将发布源代码。

在图1中:当尚未达到最大长度时,我没有水平滚动条

在图 2 中:当达到最大长度 10.000 个字符时,StyledDocument 会使用 styleddoc.getDocument().remove(0, maxsize); 进行裁剪

/image/i10KZ.png [图片1]

/image/dUZ0K.png [图2]

(非常抱歉,因为这是我的第一个问题,所以我不允许发布图片作为拒绝垃圾邮件的措施)

正如你所见,水平滚动条突然出现,我的布局完全困惑了,在任何情况下,当文本不适合时,都不会像删除之前那样整齐地分成几行。

现在,这是我的来源。请帮助我找到解决这个问题的天才解决方案。

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 字符,即使一部分被删除。我已经尝试了几种方法,甚至只是使用一个普通的“文档”来代替样式化的文档,但这不是选择,因为我计划在我的聊天小程序中实现颜色和表情符号的使用。

事先感谢每一位对此进行调查的人!我会尽可能跟进。

谨致问候,史蒂文·库斯特斯

PS:为什么我要删除 StyledDocument 的部分内容?内存管理,因为这是聊天 Applet 的一部分,最多可供 200 人同时使用,当每个人每 10 秒说一句话时,一分钟后您会收到 1200 条消息,当这种情况持续 10 小时时,将使用大量内存:估计最大负载为 720.000 条消息。 (最坏情况(或最好情况,取决于观点))

最佳答案

您的问题有很多不同的部分,但其中一个部分可能很容易解决。听起来您最关心的是如何从文档中删除行。有人已经实现了一个 DocumentListener 来为您处理这方面的问题。查看LimitLinesDocumentListener 。该页面链接到该类的源代码,其中还包含有关如何从文档中删除行的示例。

关于java - 删除 StyledDocument 先进后出的一部分并保留布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13388532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com