我在JPanel
添加了JViewport
,面板上添加了其他几个面板。我正在尝试实现拖动选择,您可以通过拖动鼠标选择多个组件。我面临的唯一问题是选择矩形被绘制在添加到主JPanel
的组件后面。我怎样才能在它们上面画画?
我的结构如下:
JFrame
- > ContentPane
- > JLayeredPane
- > JScrollPane
- > JPanel
- > JPanel []
。
大学作业设计草案:
如您所见,矩形位于其他面板后面。
答案 0 :(得分:12)
这就是我现在正在做的事情(显然在更简单的层面上),并且Swing在添加到其中的组件下面绘制矩形。
这是一种应该覆盖面板的paint()方法而不是paintComponent()方法的情况。然后,在绘制完所有子组件之后,将完成自定义绘制。
答案 1 :(得分:4)
使用分层窗格:
http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html
这允许您创建重叠的组件。
使用玻璃窗格来处理拖动绘画,以及可能的事件:
http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#glasspane
答案 2 :(得分:1)
如果没有看到您的实际代码,很难说您做错了什么。但是,我仍然可以说我会做什么:
创建一个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);
}
答案 3 :(得分:1)
答案 4 :(得分:0)
好的,这是我最终决定做的事情:
我不确定这是否是最好的方法,但似乎工作正常
注意:使用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);
...
答案 5 :(得分:0)
JLayeredPane为Swing组件上的自定义绘画提供了便利。 T his article描述了一个抽象基类,它有助于重复绘制特定区域(如选择矩形或组件边界)。