我试图做一个服务,其中有一个JTextArea中,每个消息是在一个单一的线被写入查看消息的图形用户界面,并在需要时wordwrapped。
这些消息通过插座到达,所以它仅是我使用更新的JTextArea一个.append(消息),我需要这些线路限制到50或100和我没有必要限制在每行字符数。
如果有以限制JTextArea中的行数的方法,或者如果存在这样做的另一种方法?
我真的可以使用的协助此事。
编辑
问题是,每个客户可以发送无限线,这些线必须是可读的,所以这不是在JTextArea中的行数的一个简单的检查。 我需要以查看更新行删除旧线。
这将是更有效?
final int SCROLL_BUFFER_SIZE = 100;
public void trunkTextArea(JTextArea txtWin)
{
int numLinesToTrunk = txtWin.getLineCount() - SCROLL_BUFFER_SIZE;
if(numLinesToTrunk > 0)
{
try
{
int posOfLastLineToTrunk = txtWin.getLineEndOffset(numLinesToTrunk - 1);
txtWin.replaceRange("",0,posOfLastLineToTrunk);
}
catch (BadLocationException ex) {
ex.printStackTrace();
}
}
}
使用此获得的行和列
添加某个DocumentFilter,检查行的量(通过doc.getLength()偏移量)和防止增加更多的文本。
或者你可以创建一个虚拟无形的JTextArea,并添加所有的文字出现。 然后衡量一个允许线和剪切的文本。
下面是这似乎工作粗的DocumentFilter。 其基本做法是让插入/追加发生,事后查询的行数,如果有更多的最大值,取出从一开始就为相应的行。
请注意:与textarea的方法计数线(最有可能,等待@Stani确认)线-CR间,而不是实际的行作为layouted。 根据您的具体要求,他们可能会或可能不会适合你(如果没有,使用斯坦的实用方法)
我很惊讶,不完全确定是否安全
- 惊讶:insert方法不叫,实现替代方法,而不是需要(在生产准备代码可能两者)
- 不知道,如果TEXTAREA是保证在过滤器的方法返回最多最新值(可能不是,则该长度检查可以包裹在一个的invokeLater)
一些代码:
public class MyDocumentFilter extends DocumentFilter {
private JTextArea area;
private int max;
public MyDocumentFilter(JTextArea area, int max) {
this.area = area;
this.max = max;
}
@Override
public void replace(FilterBypass fb, int offset, int length,
String text, AttributeSet attrs) throws BadLocationException {
super.replace(fb, offset, length, text, attrs);
int lines = area.getLineCount();
if (lines > max) {
int linesToRemove = lines - max -1;
int lengthToRemove = area.getLineStartOffset(linesToRemove);
remove(fb, 0, lengthToRemove);
}
}
}
// usage
JTextArea area = new JTextArea(10, 10);
((AbstractDocument) area.getDocument()).setDocumentFilter(new MyDocumentFilter(area, 3));
我的方法的工作原理与JTextPane的内容作为文档。 它假定你的程序已经遍地添加文本文档的末尾,这样当你调用doc.getCharacterElement(1),你会得到基本表示的代码最早线片式元件。 这就是我们要删除,于是我们得到该元素的开始和结束偏移,并调用remove方法来削减最早的文字。
这可以通过检查是否总字符数是超过一百万更大(因为我已经做了如下)选择性地执行,或根据您已经添加的行数。
如果你想以它已添加的行数,你将需要得到每个打印到的JTextPane时间增加一个字段,那么这段代码运行一次,每次打印文本的新行时间和计数超过您最大值。
JTextPane pane = ...
StyledDocument doc = pane.getStyledDocument();
int size = doc.getLength();
if (size > 1000000) {
out.println("Size: " + size);
out.println(":" + 1);
int i = 0;
Element e = doc.getCharacterElement(i + 1);
int start = e.getStartOffset();
int end = e.getEndOffset();
try {
doc.remove(start, end);
} catch (BadLocationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
干杯!