在Swing中绘制组件顶部?
我有一个JPanel
添加到JViewport
,面板上添加了几个其他面板。 我正在尝试实现拖动选择,您可以通过拖动鼠标选择多个组件。 我面临的唯一问题是选择矩形被添加到主JPanel
的组件后面。 我怎样才能在它们上面画画?
我的结构如下:
JFrame
– > ContentPane
– > JLayeredPane
– > JScrollPane
– > JPanel
– > JPanel []
。
大学任务设计草案:
如您所见,矩形位于其他面板后面。
这就是我已经在做的事情(显然在更简单的层面上),并且Swing在添加到其中的组件下面绘制矩形。
在这种情况下,您应该覆盖面板的paint()方法而不是paintComponent()方法。 然后,在绘制所有子组件之后,将完成自定义绘画。
使用分层窗格:
http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html
这允许您创建重叠的组件。
使用玻璃窗格来处理拖动绘画,以及可能的事件:
http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#glasspane
我真的很确定你真正需要什么和最后的效果,也许还有另外两种绘画方式
1) GlassPane
2) 视口
你可以将它们放在一起,对可见的Rectanle
如果没有看到您的实际代码,很难说您做错了什么。 但是,我仍然可以说我会做什么:
创建一个JPanel,代表您要绘制的整个区域,当然 – 包含每个组件。
覆盖该面板的paintComponents(Graphics)
就像这样(EDITED,注意s
现在是方法名称中的最后一个字符):
@Override public void paintComponents(Graphics g) { // ^ super.paintComponents(g); // Draw your selection rectangle: g.setColor(Color.RED); g.drawRectangle(selectionRectangle); }
好的,这是我最终决定做的事情:
我不确定这是否是最好的方法,但似乎工作正常。
注意:使用MigLayout。
在JPanel
的构造函数中,位于彩色块下方。
... this.add(new JPanel() { @Override public boolean isOpaque() { return false; } @Override public void paintComponent(Graphics g) { if (dragShape != null) { g.setColor(Colors.SECONDARY); g.setStroke(new BasicStroke(2)); g.draw(dragShape); } } }, "pos 0 0, width 100%, height 100%", 0); ...
JLayeredPane为Swing组件上的自定义绘画提供了便利。 他的文章描述了一个抽象基类,它有助于重复绘制特定区域(如选择矩形或组件边界)。
- 我可以在Java中向String类添加新方法吗?
- Java – Selenium WebDriver – 如何检查文件下载对话框是否可见? (不下载只有可见性)
- 让java IAIK PKCS11包装器适用于nfast
- 如何刷新Eclipse View插件
- 控制对“.internal”包的访问的最佳实践
- 从另一个项目注入FeignClient时出错
- 使用Ant时java.security.AccessControlException,但从控制台调用java时运行正常
- Play framework 2.2.1:为测试创建Http.Context
- Quartz Spring CronTrigger发射次数超过配置次数