Java 在Swing中的组件顶部喷漆?

Java 在Swing中的组件顶部喷漆?,java,swing,jpanel,paintcomponent,miglayout,Java,Swing,Jpanel,Paintcomponent,Miglayout,我将一个JPanel添加到JViewport,该面板还添加了几个其他面板。我正在尝试实现一个拖动选择,通过拖动鼠标可以选择多个组件。我面临的唯一问题是,选择矩形被绘制在添加到主JPanel的组件后面。我怎么能在上面画画 我的结构如下:JFrame->ContentPane->JLayeredPane->JScrollPane->JPanel 大学作业设计稿: 如您所见,矩形位于其他面板的后面 如果看不到您的实际代码,很难说出您做错了什么。但是,我仍然可以说我会做什么: 创建一个JPanel,它表

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

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

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


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

创建一个JPanel,它表示要绘制的整个区域,其中当然包含每个组件。
覆盖该面板的
paintComponents(Graphics)
如下(经过编辑,请注意
s
现在是方法名称的最后一个字符):

使用分层窗格:

这允许您创建重叠的组件

使用玻璃窗格处理拖动绘制,也可能处理事件:


热真的很确定你真正需要什么和最终效果,也许还有两种方法可以画画

(一)

(二)


你可以把它们放在一起,把
插入到可见的
Rectanle
好的,这就是我最后决定做的:
我不确定这是否是最好的方法,但似乎效果不错。
注意:使用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);
  ...

这就是我已经在做的(显然是在一个更简单的层次上),Swing在添加到它的组件下面绘制矩形


在这种情况下,您应该重写面板的paint()方法,而不是paintComponent()方法。然后,在所有子组件绘制完成后,将进行自定义绘制。

在Swing组件顶部的自定义绘制由JLayeredPane提供帮助。T描述了一个抽象基类,它有助于过度绘制特定区域(如选择矩形或组件边界)。

这是我已经在做的事情(显然是在一个更简单的层次上),Swing在添加到它的组件下面绘制矩形。嗯,然后尝试替代paintComponents。好的,所以我的结构如下:JFrame->ContentPane->LayeredPane->JScrollPane->JPanel->JPanel[]。我已经在问题中添加了一个屏幕截图。你必须将LayeredPane放在JScrollPane中才能滚动覆盖图(如果你想要的话)。我想我明白你的意思了。例如:
JFrame
->
ContentPane
->
JLayeredPane
->
JScrollPane
->JLayeredPane->
JPanel
>
JPanel[]
究竟是什么?您可以添加原始日历绘图组件作为第一层,然后在其顶部添加绘制拖动细节的玻璃窗格。第一层是使用包含约会对象(彩色块)的
JPanel[]
绘制网格等的
JPanel
。第一个窗口添加到
JScrollPane
JViewport
,该窗口添加到
JFrame
ContentPane
的主
JLayeredPane
。翻转,如果有意义的话?+1:看起来很不错!它运行在什么操作系统上?或者使用什么样的外观和感觉?字体看起来像“Ubuntu”。目前在Windows上,但当我完成后,它在Windows和Mac上看起来是一样的。我从头开始创建了所有组件,这可能是一种天真的方式,但我喜欢它允许的设计自由度。字体是Gotham,但我不确定是否会坚持下去帕尔组件从头开始!?!看起来太棒了!!!你应该考虑免费出版或非免费出版(我的意思是Haha)。谢谢你的夸奖!!!)当我完成它的时候,我会考虑创建一个LNF-感谢这个想法。
 ...
 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);
  ...