具有重写的paintComponent方法的子组件将组件绘制到JPanel上方

时间:2019-03-06 16:05:07

标签: java swing

我有一个使用OverlayLayout布局管理器的父JPanel,并且JPanel包含一个主面板和一个覆盖面板。

例如

setLayout(new OverlayLayout(this));
add(overlayPanel)
add(mainPanel);

这工作正常,但是主面板包含我控件之外的许多组件,并且许多组件都覆盖了paintComponent,并且在重新绘制时最终将它们绘制在覆盖面板的顶部。

如果然后我调整整个窗口的大小,则2个面板正确堆叠显示。有什么方法可以防止这种情况发生,或者收到有关子组件已重绘的通知,然后可以重新绘制整个窗口?

我确实尝试过使用JLayeredPane,但是由于无法调整主窗口的大小以及不使用LayoutManager的原因,我感到很苦恼,因此我不得不设置界限,而我却努力使它起作用。

1 个答案:

答案 0 :(得分:2)

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

但是,当使用OverlayLayout时,组件将按3维进行绘制,因此绘制单个组件会影响其他组件。因此,您需要删除默认情况下完成的优化绘画:

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

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

或者在您的情况下,您似乎在扩展JPanel,因此您只需要覆盖isOptimizedDrawingEnabled()方法。