在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组件上的自定义绘画提供了便利。 他的文章描述了一个抽象基类,它有助于重复绘制特定区域(如选择矩形或组件边界)。