1

基本上这就是我想要做的:

我在两个单独的 JScrollPanes 中有两个单独的 JTextArea,我想将它们组合起来,所以当第一个 TextArea 的文本太长时,它应该在第二个 TextArea 上继续。但它也应该与滚动一起使用:如果我滚动第一个 TextArea,第二个应该滚动它(反之亦然)。我试图计算可显示的最大可能线条,以便我知道有多少线条可见。我找到了这个:

public void paint(Graphics g) {   
        super.paint(g);   
        final FontMetrics fontMetrics = g.getFontMetrics();   
        // get width of any char (font is monospaced)   
        final int charWidth = fontMetrics.charWidth('M');   
        final int charHeight = fontMetrics.getHeight();   
        final int prefWidth = this.getPreferredSize().width;   
        // get height of Parent (JScrollPane)   
        final int prefHeight = this.getParent().getHeight();   

        int maxChars = prefWidth/charWidth;   
        int maxLines = prefHeight/charHeight;   
    }  

但该getParent().getHeight()方法不起作用,因为我用我的 LayoutManager 设置组件的大小(SpringLayout,我只是定义约束来设置组件的大小,我认为这是固定组件比例的最佳方法,甚至调整窗口大小后。如果我在这里错了,请纠正我,经过数小时尝试各种 LayoutManagers (这些都是坏而丑陋的),我没有任何动机进一步考虑这个问题)。所以该getHeight()方法一直返回0,因为我从未设置大小。

是否有任何其他方法可以获取嵌套在 ScrollPane 中的 TextArea 的可见行?或者我在这里完全错了,应该以其他方式吗?

谢谢您的帮助。

4

2 回答 2

1

我从来没有做过类似的事情,但我认为看待问题的方法是重新定义问题。

您实际上需要对同一文档进行 2 个视图。视图编号 1 将显示所有字符,直到某个最大长度。视图编号 2 将显示所有其余部分。

我认为这可以通过创建一个自定义Document类来实现,该类共享基础数据(可能是一个主 Document,以便您获得文档的更新事件)并具有不同的偏移量。

每个 JTextAreas 都有它自己的 Document 实例。

当第一个窗口已满时,您仍然必须手动跳转到第二个窗口(尽管您当然可以对 TextArea 进行编程,使其在达到 MAX_LENGTH 时自动执行此操作)。

我看不到连接滚动条的优势,因为它们显示不同的数据。为什么滚动到区域 1 的第 100 行意味着您要滚动到区域 2 的第 1100 行?

而且我认为您不应该触摸该paint方法。这是您需要的业务逻辑,而不是图形:)

于 2011-03-11T11:57:12.007 回答
1

你的要求对我来说毫无意义:

所以当第一个TextArea的文本太长时,应该在第二个继续

好的,让我们说创建每个文本区域以显示 10 行。第一次输入 20 行,然后溢出到第二行,现在只有 1 行。

如果我滚动第一个 TextArea,第二个应该随之滚动(反之亦然)。

当它只有 1 行时,如何滚动文本区域?

于 2011-03-11T16:27:00.453 回答