我在 a 中JPanel
添加了一个JViewport
,并且该面板还添加了其他几个面板。我正在尝试实现拖动选择,您可以通过拖动鼠标选择多个组件。我面临的唯一问题是选择矩形被绘制在添加到 main 的组件后面JPanel
。我怎样才能在它们上面画画?
我的结构如下:JFrame
-> ContentPane
-> JLayeredPane
-> JScrollPane
-> JPanel
-> JPanel []
。
大学作业的设计草案:
如您所见,矩形位于其他面板的后面。
我在 a 中JPanel
添加了一个JViewport
,并且该面板还添加了其他几个面板。我正在尝试实现拖动选择,您可以通过拖动鼠标选择多个组件。我面临的唯一问题是选择矩形被绘制在添加到 main 的组件后面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
如果没有看到您的实际代码,很难说出您做错了什么。但是,我仍然可以说我会做什么:
创建一个 JPanel,它代表您要绘制的整个区域,当然,它包含每个组件。
像这样覆盖该面板paintComponents(Graphics)
(已编辑,注意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 组件之上的自定义绘制。这篇文章描述了一个抽象基类,它有助于对特定区域(如选择矩形或组件边界)进行重绘。