Java 具有重写的paintComponent方法的子组件在JPanel顶部绘制组件

Java 具有重写的paintComponent方法的子组件在JPanel顶部绘制组件,java,swing,Java,Swing,我有一个使用OverlyLayout布局管理器的父JPanel,该JPanel包含一个主面板和over-lay面板 乙二醇 这很好,但是主面板包含很多我无法控制的组件,很多组件已经覆盖了paintComponent,当它们重新绘制时,它们最终被绘制在覆盖面板的顶部 如果我调整整个窗口的大小,两个面板将正确堆叠显示。有没有办法防止出现这种情况,或者收到子组件已重新绘制的通知,以便重新绘制整个窗口 我确实尝试过使用JLayeredPane,但由于主窗口的大小可以调整,而且它没有使用LayoutMan

我有一个使用OverlyLayout布局管理器的父JPanel,该JPanel包含一个主面板和over-lay面板

乙二醇

这很好,但是主面板包含很多我无法控制的组件,很多组件已经覆盖了paintComponent,当它们重新绘制时,它们最终被绘制在覆盖面板的顶部

如果我调整整个窗口的大小,两个面板将正确堆叠显示。有没有办法防止出现这种情况,或者收到子组件已重新绘制的通知,以便重新绘制整个窗口


我确实尝试过使用JLayeredPane,但由于主窗口的大小可以调整,而且它没有使用LayoutManager,所以我不得不设置边界,我很难让它正常工作

通常情况下,面板包含以二维绘制的组件,因此您可以只重新绘制单个组件,而不会影响其他组件。绘画针对这种情况进行了优化

但是,在使用OverlayLayout时,零部件是在三维中绘制的,因此绘制单个零部件可能会影响其他零部件。因此,您需要删除默认情况下完成的优化绘制:

JPanel main = new JPanel()
{
    @Override
    public boolean isOptimizedDrawingEnabled()
    {
        return false;
    }
};

main.setlayout( new OverlayLayout(main) );
main.add( overlayPanel );
main.add( backgroundPanel );
或者在您的情况下,看起来您正在扩展JPanel,因此您只需要重写
isOptimizedDrawingEnabled()
方法

JPanel main = new JPanel()
{
    @Override
    public boolean isOptimizedDrawingEnabled()
    {
        return false;
    }
};

main.setlayout( new OverlayLayout(main) );
main.add( overlayPanel );
main.add( backgroundPanel );