У меня есть экран, на котором я поместил 3 панели, как
- Основная панель
- Левая панель
- Правая панель
Панели стенда будут иметь половину размера родительской панели.
Я хочу скрыть левую панель, не нарушая компоновку. и без изменения менеджера компоновки (это как-то жестко прописано в моем требовании BorderLayout). Правая панель по-прежнему должна иметь половину размера главной панели.
Мое решение:
Я переопределил методы рисования и добавил логическое значение 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();
}
}
}
Почти все работает, но у меня есть проблема с обновлением из-за следующего теста
Я добавил 2 кнопки на экран. один для изменения состояния видимости, а другой для скрытого состояния.
Панели стенда скрыты и не показаны. Если я сейчас нажму кнопку «видимость», кнопка будет нарисована в области скрытой панели. если я изменяю размер, если экран вручную с помощью курсора мыши, событие перерисовки обновляет скрытые панели, и неправильно нарисованный объект удаляется.
- Как я могу справиться с этим делом?
- У кого-нибудь есть лучшее решение?