将JScrollPane保持为相同长度的java

时间:2014-08-19 19:47:01

标签: java swing jscrollpane jtextarea executorservice

我有几个JScrollPane,每个JTextArea包含一个JTextAreaScheduledExecutorService填充了一系列不断更新的变量。

我有一个JTextArea,它会不断清除JScrollPan并替换变量。对于大多数JScrollPane es而言,更改非常无缝,看起来列表中包含的数字会以平滑的方式发生变化。

有一个JScrollPane提出了问题。它将不断发出闪光(文本区域和滚动条变为空白并重新出现),这与重新绘制相关(我应该注意,即使其他窗格以完全相同的方式更新,它们也不会遇到此问题)。滚动条也会疯狂滚动(回到顶部);总而言之看起来非常凌乱。这个特殊的JScrollPane也是最长的,所以我认为这就是原因。这个特定的窗格与其他窗格没有任何不同。

除非有人有更好的解决方案,否则我认为我最好的选择是将Caret设置为 NEVER_UPDATE ,但为了实现这一点,{{1}即使我将所有文本都清空,也必须保持相同的大小。

有谁知道怎么做?为了澄清,我不想让窗格变大,我希望基本上能够向下滚动到设定的长度,即使窗格是空的。

1 个答案:

答案 0 :(得分:2)

我不确定这是否是您正在寻找的内容,但在过去,我创建了一个不断更新的JTextPane,其中包含每种颜色编码的异常消息。它有一个滚动窗格和一个文本大小缓冲区,所以当它到达时,它将从头开始删除附加到末尾的文本量。

每当我发现异常时,我就跑了:

printExceptionMessage(new TCException(ex));

反过来:

protected void printExceptionMessage(final TCException exception) {

    SwingUtilities.invokeLater(
        new Runnable() {
            public void run() {

                Date recordDate = exception.getTimeStamp();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd 'at' HH:mm:ss z");
                String recordTime = sdf.format(recordDate);

                String message = "(" + recordTime + ") EXCEPTION:   " + exception.getMessage() + "\n";

                statusColorTextPane.setEditable(true);

                // trim the textPane to the buffer size
                Document doc = statusColorTextPane.getStyledDocument();
                int overLength = doc.getLength() + message.length() - Foo.TEXT_BUFFER_SIZE;

                if (overLength > 0) {
                    try {
                        doc.remove(0, overLength);
                    } catch (Exception ex) {

                        System.err.println("Error occured while trimming the textPane.");
                        ex.printStackTrace();
                    }
                }
                statusColorTextPane.append(Color.red, message);
                statusColorTextPane.setEditable(false);
            }
        });     
}

在这种情况下,statusColorTextPane是JTextPane的扩展类。它需要这两种方法:

public void appendNaive(Color c, String s) { // naive implementation

    SimpleAttributeSet aset = new SimpleAttributeSet();
    StyleConstants.setForeground(aset, c);

    int len = getText().length();
    setCaretPosition(len); // place caret at the end (with no selection)
    setCharacterAttributes(aset, false);
    replaceSelection(s); // there is no selection, so inserts at caret
}

public void append(Color c, String s) { // better implementation--uses StyleContext

    StyleContext sc = StyleContext.getDefaultStyleContext();
    AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY,
                                    StyleConstants.Foreground, c);

    int len = getDocument().getLength(); // same value as getText().length();
    setCaretPosition(len);  // place caret at the end (with no selection)
    setCharacterAttributes(aset, false);
    replaceSelection(s); // there is no selection, so inserts at caret
}

Foo.TEXT_BUFFER_SIZE对我来说我已经设置为20000。