如何制作一个包含点集合的JScrollPane?

时间:2013-01-08 08:34:43

标签: java swing scroll jscrollpane

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

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

我不确定如何使用JScrollPane API执行此操作,这似乎要求您设置底层组件的首选大小,但似乎没有该组件的偏移或原点的概念。 (基础JViewport似乎能够做到,但我无法弄清楚JViewport API。)

2 个答案:

答案 0 :(得分:4)

滚动窗格和视图端口实际上与它无关。您需要的是更改视图端口视图的首选大小,并让滚动窗格/视图端口负责此休息。

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

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

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

答案 1 :(得分:1)

好的,事实证明,简单的答案是滚动窗格无法滚动到负坐标。正如@MadProgrammer建议的那样,你需要做的是保持一个单独的偏移坐标,即Point。偏移量存储整个文档的顶部/左侧坐标。渲染单个对象时,设置Graphics2D对象的变换,使它们向下和向右移动偏移量,以便所有对象都以正数坐标绘制,即使实际上它们可能位于负坐标。同样,在计算滚动窗格的preferredSize时,请在文档宽度和高度的偏移量中添加。滚动条事件的坐标也需要根据需要进行偏移。

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