2

我意识到还有另一个与“无限”JScrollPanes 相关的问题,但是我认为我正在寻找的是一些微妙不同的东西。

基本上,我有一组可以向任何方向拖动的对象,并且滚动视口的范围应始终包含所有这些对象的边界矩形。换句话说,文档没有固定的“来源”。因此,如果您将一个对象拖到左侧,离开屏幕边缘,那么视口范围应该在负方向扩展以包含该对象的新位置。(它也应该在您拖动时自动滚动,但我意识到这是一个单独的问题。)

我不确定如何使用 JScrollPane API 来执行此操作,它似乎希望您设置底层组件的首选大小,但似乎没有该组件的偏移量或原点的概念。(底层的 JViewport 似乎可以做到,但我无法真正弄清楚 JViewport API。)

4

2 回答 2

4

滚动窗格和视口实际上与它无关。您需要做的是更改视口视图的首选大小,并让滚动窗格/视口负责其余部分。

基本上,您需要做的是计算组件上的最宽和最高点并使视口无效,以强制重新计算其布局要求。

为自己创建一个自定义组件(使用JPanel例如)并覆盖该getPreferredSize方法。此方法应返回组件所需的大小。

当尺寸要求发生变化时,请致电revalidate()

于 2013-01-08T08:44:57.380 回答
1

好的,事实证明,简单的答案是滚动窗格不能滚动到负坐标。正如@MadProgrammer 建议的那样,您需要做的是维护一个单独的偏移坐标,即一个点。偏移量存储整个文档的上/左坐标。渲染单个对象时,设置 Graphics2D 对象的变换,使它们向下和向右移动偏移量,以便所有对象都在正数坐标处绘制,即使实际上它们可能位于负坐标处. 同样,在计算滚动窗格的preferredSize 时,将偏移量添加到文档的宽度和高度。滚动条事件的坐标也需要适当偏移。

这使您可以保持文档边界不受限制为正数的错觉,并且文档的边界可以在任何方向无限扩展。

于 2013-01-22T03:45:30.107 回答