基本上这就是我想要做的:
我在两个单独的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
方法。这是您需要的业务逻辑,而不是图形:)