java隐藏JPanel而不破坏布局
我确实有一个屏幕,其中我放置了3个面板,如
- 主面板
- 左面板
- 右面板
展台面板的尺寸为母面板尺寸的一半。 我想在不破坏布局的情况下隐藏左侧面板。在不更改布局管理器的情况下(这在我的需求“BorderLayout”中以某种方式硬编码)。右侧面板的大小仍应为主面板的一半
我的解决方案: 我重写了paint方法并添加了一个布尔值“propHideContents”
@Override
public void paintComponents(Graphics g) {
if (propHideContents && isVisible()) {
paintBlankPanel(g);
return;
}
super.paintComponents(g);
}
@Override
protected void paintChildren(Graphics g) {
if (propHideContents && isVisible()) {
paintBlankPanel(g);
return;
}
super.paintChildren(g);
}
private void paintBlankPanel(Graphics g) {
Graphics scratchGraphics = (g == null) ? null : g.create();
try {
scratchGraphics.setColor(this.getBackground());
scratchGraphics.clipRect(0, 0, this.getWidth(), this.getHeight());
} finally {
scratchGraphics.dispose();
}
}
隐藏逻辑看起来像
public void setPropHideContents(boolean propHideContents) {
if (this.propHideContents != propHideContents) {
this.propHideContents = propHideContents;
setEnabled(!propHideContents);
if (getParent() != null) {
getParent().repaint();
}
}
}
几乎所有的东西都在工作,但是在下面的测试用例中我确实遇到了刷新问题
我在屏幕上添加了两个按钮。一个用于更改可见性状态,另一个用于隐藏状态
展台面板隐藏,未显示。如果我现在按下“可见性”按钮,按钮将在隐藏面板的区域中绘制。如果使用鼠标光标手动更改屏幕的大小,则“重新绘制”事件将刷新隐藏的面板,并删除绘制错误的对象
- 我怎么处理这些案子李>
- 有人有更好的解决方案吗李>
# 1 楼答案
您的解决方案不可行,无法修复。绘制并不完全源于父组件,如果需要,子组件可以自行绘制(这是您的体验)
如果由于外部要求而无法使用其他布局管理器,则必须删除左侧面板的内容以隐藏它们。只需将孩子们包裹在另一个面板中,这样面板在卸下时就可以很容易地存放起来
# 2 楼答案
不只是左右面板,而是放置一个带有卡片布局的容器。每个容器应具有左(或右)面板和占位符(例如,一个或多个面板)。当你想隐藏左(或右)面板时,只需交换显示空面板的卡片