GWT StackLayoutPanel: динамическая и автоматическая высота - PullRequest
5 голосов
/ 19 апреля 2011

Я использую StackLayoutPanel, чтобы показать сложенные электронные письма разговора в виде gmail, где заголовок - отправитель, а дочерний - тело письма.Для динамического характера этого я могу только оценить высоту моего стека в коде.Чтобы оценить рост тела, я мог бы получить ширину окна клиента, а затем приблизительно угадать, сколько строк занимает тело.Но это трудоемко и, вероятно, будет неправильно.

Мой вопрос: есть ли способ для StackLayoutPanel, как для GWT API 2.2, знать и таким образом автоматически устанавливать высоту отображения текущего показанного дочернего элемента (плюс его заголовок и другие заголовки)?

Боюсь, что нет, я пробовал другие вещи, которые также, однако, терпят неудачу.Я пытался:

  1. Поместить StackLayoutPanel внутри ScrollPanel:

    • Если я не установил в коде размер стека, таинственным образом я могу видеть толькозаголовок первого стека и ничего более, ни его тело, ни другие заголовки.
    • Если я его установлю, то у меня возникнет проблема с оценкой роста тела.
  2. Не внутри ScrollPanel: стек автоматически получает размер оставшегося пространства окна, но при слишком большом количестве заголовков они перекрываются и накладываются друг на друга.

Кроме того, кажется, что по умолчаниюПоведение StackLayoutPanel состоит в том, чтобы показывать остальные заголовки в самом конце выделенного пространства, а не только после потомка заголовка before.Можно ли это изменить?

Помощь по этому вопросу будет принята с благодарностью.

// Я знаю, что похожий вопрос - this , но я думаю, что я буду его расширять.

Ответы [ 3 ]

2 голосов
/ 27 декабря 2011

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

2 голосов
/ 11 июня 2011

Вы правы, вы расширяете предыдущий вопрос, где ответ прост: stackLayoutPanel.setHeight ((40 * numChildren + 200) + "px");

Размер тела 200px зависит от содержимого и достаточно для того, чтобы StackLayoutPanel, вероятно, не собирался сокращать его для вас.

Я думаю, что шкаф, который вы собираетесь использовать со StackLayoutPanel, должен использовать фиксированную ширину тела и использовать ScrollPanel ВНУТРИ тела (не SLP внутри SP). Таким образом, все электронные письма могут отображать весь контент в ScrollPanel.

Поскольку это немного компромисс, альтернативой является просто реализовать собственный виджет. Я бы, вероятно, использовал VerticalPanel в качестве основного виджета и просто скрывал и отображал элементы div (сохраняя заголовки видимыми все время)

1 голос
/ 20 августа 2012

Если вы расширяете StackLayoutPanel и пишете метод resize (), используя видимую высоту виджета, а также произвольное число для высоты заголовков панели:

public void resize() {
    int panelHeight = super.getVisibleWidget().getOffsetHeight();
    this.setHeight(panelHeight + 200 + "px");
}

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

...