Свернутая панель содержимого не показывает новый заголовок

У меня есть ContentPanel, который настроен на сворачивание

ContentPanel bottomPanel = new ContentPanel();
BorderLayoutData layoutData = new BorderLayoutData(LayoutRegion.SOUTH);
layoutData.setSplit(true);
layoutData.setCollapsible(true);

// some code

add(bottomPanel, layoutData);

и установите заголовок этой панели с помощью

bottomPanel.setHeading("title");

Если панель не свернута, установка заголовка устанавливает новый заголовок этой панели. Но если панель свернута, она не работает. Заголовок всегда показывает последний заданный заголовок, пока он не свернут. В обоих состояниях, свернутом и не свернутом, геттер всегда возвращает новый заголовок.

bottomPanel.getHeading(); // "old Heading"
bottomPanel.setHeading("new Heading");
bottomPanel.getHeading(); // "new Heading"

Я думаю, что это своего рода проблема рендеринга


person Alex Schulze    schedule 12.06.2013    source источник
comment
вызовите bottomPanel.layout() после установки нового заголовка   -  person swamy    schedule 12.06.2013
comment
ни вызов bottomPanel.layout(), ни bottomPanel.repaint() не работают   -  person Alex Schulze    schedule 12.06.2013
comment
После того, как заголовок установлен на панель содержимого gxt, он будет там либо свернут, либо не свернут. Поэтому после сворачивания вы должны установить заголовок и макет вызова.   -  person swamy    schedule 12.06.2013
comment
Проблема не в том, что после сворачивания заголовок не отображается. После сворачивания показывает прежний заголовок. Но если он свернут и я вызову setHeading, он не покажет новый заголовок. Другими словами, если он свернут и я вызываю setHeading и layout, он ничего не делает.   -  person Alex Schulze    schedule 12.06.2013


Ответы (3)


Когда ContentPanel свернута, заголовок (HEAD) заменяется CollapsedPanel, который создает свой собственный элемент заголовка и недоступен для модификации (даже если вы измените заголовок ContentPanel).

Проверьте CollapsePanel.class > onRender(...)

com.extjs.gxt.ui.client.widget.ContentPanel
com.extjs.gxt.ui.client.widget.CollapsePanel
com.extjs.gxt.ui.client.widget.layout.BorderLayout
person Pablo Chvx    schedule 12.06.2013
comment
То есть нет возможности задать заголовок, если панель свернута? - person Alex Schulze; 12.06.2013
comment
К сожалению, не в то время, не используя управление как есть. - person Pablo Chvx; 12.06.2013

Хотя невозможно обновить заголовок ContentPanel, пока он свернут, можно запрограммировать обходной путь:

  1. развернуть панель
  2. установить новый заголовок
  3. свернуть панель

Кроме того, что это обходной путь и не красивый, у него есть только один недостаток: пользователь увидит, как панель рушится (автоматически). Пока это вас не беспокоит, этот обходной путь установит новый заголовок для «свернутой» панели.

Прежде всего: звоните не setCollapsible(boolean) на LayoutData, а на ContentPanel! В противном случае это не сработает.

ContentPanel bottomPanel = new ContentPanel();
bottomPanel.setCollapsible(true);
BorderLayoutData layoutData = new BorderLayoutData(LayoutRegion.SOUTH);
layoutData.setSplit(true);
//layoutData.setCollapsible(true);

После этого вы можете установить новый заголовок следующим образом:

public void setNewHeading(ContentPanel panel, String heading) {
  if(panel.isCollapsed()) {
    panel.expand();
  }

  panel.setHeading(heading);

  DeferredCommand.addCommand(new Command() {
    public void execute() {
      panel.collapse();
    }
  });
}

Ключевым здесь является DeferredCommand, который будет выполняться, когда все ожидающие обработчики событий завершатся.

person KeyNone    schedule 14.02.2014

вот упрощенная версия того, что я делаю (GXT 3).

Код ниже отображает некоторый текст в CollapsePanel, когда виджет севера свернут:

borderLayoutContainer.addCollapseHandler(
    new CollapseItemHandler<ContentPanel>() {
        @Override
        public void onCollapse(CollapseItemEvent<ContentPanel> event) {
            if (event.getItem() == northContentPanel) {
                CollapsePanel collapsePanel = (CollapsePanel) borderLayoutContainer.getNorthWidget();
                collapsePanel.getElement().insertFirst("<span style='color: red; font-size: bold;'>Here is the collapsed panel title</span>");
            }
        }
    });

Конечно, вместо того, чтобы вставлять свой заголовок в качестве первого элемента CollapsePanel, вы могли бы сделать что-то более умное, например вставка сложного виджета.

person Andrei Cojocaru    schedule 21.07.2014