Свитият ContentPanel не показва ново заглавие

Имам 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 contentpanel, или е свито, или не е свито, то ще бъде там. Така че след свиването трябва да зададете заглавка и оформление на извикване.   -  person swamy    schedule 12.06.2013
comment
Проблемът не е, че заглавието не се показва след свиване. След като се свие, той показва заглавието от преди. Но ако е свит и извикам setHeading, той не показва новото заглавие. С други думи, ако е свит и извикам setHeading и оформление, това не прави нищо.   -  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