我想使用ScrollPane在其视口中显示图像,并在图像上叠加网格(或框或任何其他类型的注册/位置标记)。我需要覆盖层在滚动时保持固定(意味着图像似乎移动到覆盖层下)。我将以固定速率滚动视口中的视图以提供平滑的动作,并且叠加层将提供对视口内某个位置的引用。从概念上讲,可以考虑在Viewport中滚动的大型地图,并且Viewport具有一个不移动的矩形(相对于视口本身),该矩形标记可根据某些用户操作进行缩放的区域。我认为(但还没有确认)ScrollPane实现可以有效地处理View的渲染(从后台存储,不必为每个新的部分曝光重新绘制整个View(甚至ViewPort)),所以更喜欢不必重写paint()方法。Java:如何在ScrollPane视口上绘制非滚动叠加层?
我已经看过LayerPane,虽然没有掌握它,但似乎这是一种蛮力的方法。 ScrollPane是SplitPane的一个组件,将被移动/调整大小。我期望我必须使用绝对定位手动维护ViewPort和LayerPane之间的正确关系。我远不是GUI设计专家&的实现,我相信我错过了一个有经验的人知道的从明显到晦涩和优雅的可能性。
我愿意接受任何建议,而不仅仅是我开始下的路径。我应该(我可以)在我的SplitPane中添加一个JPanel作为一个组件,然后添加一个LayerPane到包含我的ScrollPane和LayerPane上不同图层上的覆盖图(另一个JPanel)? ScrollPane中是否有直接支持这一功能的功能?我已经看过Java Swing教程和API文档,但还没有看到任何东西。
谢谢。
UPDATE:
感谢您的链接,trashgod。这比我预期的要容易得多。不需要LayerPane,GlassPane,基于xor的合成...我不知道为什么我没有尝试覆盖JViewport.paint()来绘制覆盖图 - 但是通过下面的代码,我验证了这个概念给我我要找的东西。只需使用JViewport的子类,它就可以做我想做的事情(在这种情况下,在视图中心覆盖一个矩形,而图像在下面滚动)。我不是GUI专家,Java API非常宽泛;我不知道你们是如何将这一切都放在你的头上 - 但是,谢谢!
class MyViewport extends JViewport {
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.BLACK);
g2.drawRect(getWidth()/4,getHeight()/4,getWidth()/2,getHeight()/2);
}
}
请参阅['ScrollPanePaint'](http://stackoverflow.com/a/3518047/230513)。更新:另见[*玻璃窗格*](http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#glasspane)。其中之一或两者都可以帮助您构建[sscce](http://sscce.org/)。 – trashgod 2012-04-10 18:30:08
该链接只是我需要的正确方向的微调。用解决方案更新了问题。感谢垃圾。 – ags 2012-04-10 19:55:28