Скрыть JPanel, не нарушая макет - PullRequest
1 голос
/ 15 ноября 2011

У меня есть экран, на котором я поместил 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 кнопки на экран. один для изменения состояния видимости, а другой для скрытого состояния.

Панели стенда скрыты и не показаны. Если я сейчас нажму кнопку «видимость», кнопка будет нарисована в области скрытой панели. если я изменяю размер, если экран вручную с помощью курсора мыши, событие перерисовки обновляет скрытые панели, и неправильно нарисованный объект удаляется.

  1. Как я могу справиться с этим делом?
  2. У кого-нибудь есть лучшее решение?

Ответы [ 2 ]

3 голосов
/ 15 ноября 2011

Вместо левой и правой панели поместите туда контейнеры с CardLayout. Каждый контейнер должен иметь левую (или правую) панель и заполнитель (например, еще одну панель). Если вы хотите скрыть левую (или правую) панель, просто поменяйте местами карты с пустой панелью.

2 голосов
/ 15 ноября 2011

Ваше решение не работает и не может быть исправлено.Рисование происходит не только от родительского компонента, дочерний компонент может быть нарисован сам по себе, если это необходимо (это то, что вы испытываете).

Если вы не можете использовать другой менеджер макета из-за внешних требований, у васудалить содержимое левой панели, чтобы скрыть их.Просто оберните дочерние элементы в другую панель, чтобы панель можно было легко хранить при ее удалении.

...