8

我在 a 中JPanel添加了一个JViewport,并且该面板还添加了其他几个面板。我正在尝试实现拖动选择,您可以通过拖动鼠标选择多个组件。我面临的唯一问题是选择矩形被绘制在添加到 main 的组件后面JPanel。我怎样才能在它们上面画画?

我的结构如下:
JFrame-> ContentPane-> JLayeredPane-> JScrollPane-> JPanel-> JPanel []

大学作业的设计草案:
如您所见,矩形位于其他面板的后面。

大学作业的设计草案。

4

6 回答 6

12

这就是我已经在做的事情(显然在更简单的层面上),Swing 在添加到其中的组件下方绘制矩形。

这是您应该覆盖面板的paint() 方法而不是paintComponent() 方法的一种情况。然后在绘制所有子组件之后进行自定义绘制。

于 2012-01-08T16:51:14.800 回答
5

使用分层窗格:

http://docs.oracle.com/javase/tutorial/uiswing/components/layeredpane.html

这允许您创建重叠组件。

使用玻璃窗格来处理拖动绘画,以及可能的事件:

http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html#glasspane

于 2012-01-08T09:32:49.957 回答
1

如果没有看到您的实际代码,很难说出您做错了什么。但是,我仍然可以说我会做什么:

创建一个 JPanel,它代表您要绘制的整个区域,当然,它包含每个组件。
像这样覆盖该面板paintComponents(Graphics)(已编辑,注意s现在是方法名称的最后一个字符):

@Override
public void paintComponents(Graphics g)
{ //                      ^
    super.paintComponents(g);

    // Draw your selection rectangle:
    g.setColor(Color.RED);
    g.drawRectangle(selectionRectangle); 
}
于 2012-01-08T09:31:40.733 回答
1

hot 真的很确定你真正需要什么和最终效果,也许还有另外两种绘画方式

1)玻璃窗格

2)视口

你可以把它放在一起,小心翼翼Insets地展示Rectanle

于 2012-01-08T09:49:20.933 回答
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);
  ...
于 2012-01-08T10:36:21.747 回答
0

JLayeredPane 促进了在 Swing 组件之上的自定义绘制。这篇文章描述了一个抽象基类,它有助于对特定区域(如选择矩形或组件边界)进行重绘。

于 2012-12-28T16:24:30.160 回答