相关疑难解决方法(0)

Java:如何在ScrollPane Viewport上绘制非滚动叠加层?

我想使用ScrollPane在其视口中显示图像,并在图像上还有一个网格(或框,或任何其他类型的注册/位置标记)覆盖.滚动时我需要叠加层保持固定(意味着图像似乎在叠加层下"移动").我将以固定速率在视口中滚动视图以提供平滑运动,并且叠加将提供对视口内某个位置的引用.从概念上讲,考虑在视口中滚动的大型地图,以及具有不移动的矩形的视口(相对于视口本身),该矩形标记可以基于某些用户动作放大的区域.

我假设(但尚未确认)ScrollPane实现有效地处理View的渲染(来自后备存储,不必为每个新的部分曝光重新绘制整个View(甚至ViewPort)),因此不希望覆盖paint()方法.

我看过LayerPane,虽然没有掌握它,但似乎这是一种蛮力的方法.ScrollPane是SplitPane的一个组件,将被移动/调整大小.我希望我必须使用绝对定位手动维护ViewPort和LayerPane之间的正确关系.我远不是GUI设计和实现方面的专家,而且我确信我缺少从有经验的人会知道的明显到模糊和优雅的可能性.

我愿意接受任何建议,而不仅仅是我开始的道路.我是否(我可以)在我的SplitPane中添加JPanel作为一个组件,然后在LayerPane的不同图层上添加一个LayerPane到包含我的ScrollPane和覆盖(另一个​​JPanel)的那个?ScrollPane中是否有功能直接支持此功能?我查看了Java Swing教程和API文档,但还没有看到任何内容.

谢谢.

更新:

感谢您的链接,trashgod.这比我预期的要容易得多.不需要LayerPane,GlassPane,基于xor的合成......我不知道为什么我没有尝试重写JViewport.paint()来绘制我的叠加层 - 但是使用下面的代码我验证了概念将给我我正在寻找的东西.只需使用JViewport的子类,它就可以完成我想要的操作(在这种情况下,当图像在下面滚动时,在Viewport的中心覆盖一个矩形).我不是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

java graphics swing overlay scrollpane

8
推荐指数
1
解决办法
3455
查看次数

标签 统计

graphics ×1

java ×1

overlay ×1

scrollpane ×1

swing ×1