在Swing中绘制组件顶部?

时间:2012-01-08 09:26:49

标签: java swing jpanel paintcomponent miglayout

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

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

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

Design draft for college assignment.

6 个答案:

答案 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)

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

1)GlassPane

2)Viewport

您可以将InsetsRectanle

一起放在一起

答案 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描述了一个抽象基类,它有助于重复绘制特定区域(如选择矩形或组件边界)。