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

我在两个单独的JScrollPanes中有两个单独的JTextAreas,并且我想将它们组合,因此当文本对于第一个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的可见行显示?还是我在这里完全错了,应该以其他方式吗?

谢谢您的帮助。

最佳答案

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

您实际上想要在同一文档上有2个视图。视图编号1将显示所有字符,直到最大长度。视图2将显示所有其余视图。

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

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

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

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

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

10-05 19:35