如何限制JTextArea中的行数?(How to Limit number of lines in

2019-09-21 19:59发布

我试图做一个服务,其中有一个JTextArea中,每个消息是在一个单一的线被写入查看消息的图形用户界面,并在需要时wordwrapped。

这些消息通过插座到达,所以它仅是我使用更新的JTextArea一个.append(消息),我需要这些线路限制到50或100和我没有必要限制在每行字符数。

如果有以限制JTextArea中的行数的方法,或者如果存在这样做的另一种方法?

我真的可以使用的协助此事。

编辑

问题是,每个客户可以发送无限线,这些线必须是可读的,所以这不是在JTextArea中的行数的一个简单的检查。 我需要以查看更新行删除旧线。

Answer 1:

这将是更有效?

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();
        }
    }
}


Answer 2:

使用此获得的行和列

添加某个DocumentFilter,检查行的量(通过doc.getLength()偏移量)和防止增加更多的文本。

或者你可以创建一个虚拟无形的JTextArea,并添加所有的文字出现。 然后衡量一个允许线和剪切的文本。



Answer 3:

下面是这似乎工作粗的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));


Answer 4:

我的方法的工作原理与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();
            }
        }

干杯!



文章来源: How to Limit number of lines in JTextArea?