我有一个使用OverlayLayout布局管理器的父JPanel,并且JPanel包含一个主面板和一个覆盖面板。
例如
setLayout(new OverlayLayout(this));
add(overlayPanel)
add(mainPanel);
这工作正常,但是主面板包含我控件之外的许多组件,并且许多组件都覆盖了paintComponent,并且在重新绘制时最终将它们绘制在覆盖面板的顶部。
如果然后我调整整个窗口的大小,则2个面板正确堆叠显示。有什么方法可以防止这种情况发生,或者收到有关子组件已重绘的通知,然后可以重新绘制整个窗口?
我确实尝试过使用JLayeredPane,但是由于无法调整主窗口的大小以及不使用LayoutManager的原因,我感到很苦恼,因此我不得不设置界限,而我却努力使它起作用。
答案 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()
方法。