基本上这就是我想要做的事情:
我在两个单独的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的可见行?或者我完全错了,应该采取其他方式吗?
感谢您的帮助。
答案 0 :(得分:1)
我从未做过类似的事情,但我认为看问题的方法是重新定义问题。
您实际上想要在同一文档上有2个视图。视图编号1将显示所有字符达到某个最大长度。查看编号2将显示所有其余部分。
我认为这可以通过创建一个共享基础数据的自定义Document类来实现(可能是一个主文档,因此您将获得文档的更新事件)并具有不同的偏移量。
每个JTextAreas都有自己的Document实例。
当第一个窗口已满时,您仍然必须手动跳转到第二个窗口(尽管您可以编程TextArea,以便在达到MAX_LENGTH时自动执行此操作)。
我没有看到连接滚动条的优点,因为它们显示不同的数据。为什么在区域1滚动到第100行意味着你想要滚动到第2区的第1100行?
我认为你不应该触及paint
方法。这是你需要的业务逻辑,而不是图形:)
答案 1 :(得分:1)
你的要求对我没有意义:
所以当第一个TextArea的文本很长时,它应该在第二个
上继续
好的,让我们说创建每个文本区域以显示10行。在第一行中输入20行,此时你会溢出到secon,现在你有1行。
如果我滚动第一个TextArea,第二个应该滚动它(反之亦然)。
当文本区域只有一行时,如何滚动文本区域?