Потребляет доступное пространство в Vaadin Gridlayout, но учитывает разрывы строк

#layout #vaadin #space

#макет #vaadin #Космос

Вопрос:

Я использую Vaadin’s GridLayout для визуализации некоторых заголовков и меток значений. В GridLayout есть 2 столбца и несколько строк. Метки заголовков находятся слева, а связанные с ними метки значений — справа.

Я хочу, чтобы первый столбец занимал как можно меньше места, а второй столбец должен занимать все оставшееся пространство окна браузера. Если метке значения требуется больше места, чем доступно, она должна разрывать строку.

Я пытался поиграть setColumnExpandRatio() . Если я определю следующее соотношение для второго столбца (и опущу спецификацию соотношения для первого столбца), тогда все будет работать так, как было запрошено, за исключением того факта, что метки значений с очень большим текстовым содержимым не прерываются в конце строки. Вместо этого появляется горизонтальная полоса прокрутки:

 public class MyPanel extends GridLayout
{
   public MyPanel()
   {
       setWidth("100%");
       setMargin(true);
       setSpacing(true);

       buildView();
   }

   public void buildView()
   {
       removeAllComponents();
       setColumns(2);
       setColumnExpandRatio(1, 1);
       ...
       titleLabel.setWidth(null);
       valueLabel.setWidth(null);

       addComponent(titleLabel);
       addComponent(valueLabel);

       setComponentAlignment(titleLabel, Alignment.TOP_RIGHT);
   }
}
  

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

Как я могу реализовать свои требования?

Ответ №1:

Содержимое Label переносится только в том случае, если Label оно имеет определенную ширину. Подумайте об этом: если ширина не определена, как вообще определить, когда переносить текст? Решение здесь так же просто, как установка ширины valueLabel в "100%" . На самом деле, это даже проще. Новый Label экземпляр по умолчанию имеет ширину 100%, поэтому вы можете просто удалить строку, для которой вы устанавливаете ширину null .

Вот пример UI класса для его тестирования:

 public class MyUI extends UI {

    @Override
    protected void init(VaadinRequest request) {

        GridLayout layout = new GridLayout();
        layout.setWidth("100%");
        layout.setColumns(2);
        layout.setColumnExpandRatio(1, 1);

        Label label1 = new Label("Lorem ipsum");
        Label label2 = new Label(
                "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
                          "Morbi augue sapien, tempus ac mattis ut, iaculis a erat. "
                          "Ut vitae ante metus. Pellentesque vitae rutrum lacus, id volutpat tellus. "
                          "Duis eget ultricies metus. "
                          "Vestibulum ac nibh eget velit pretium semper et eget est. "
                          "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. "
                          "Curabitur nec rutrum tellus. Curabitur vel urna a nunc cursus congue. "
                          "Vestibulum pellentesque mi in leo luctus, sit amet auctor enim ornare. "
                          "Proin in mauris convallis, vestibulum nisi sed, consectetur dolor. "
                          "Vestibulum ultricies metus ut nulla gravida, eget dapibus turpis fringilla. "
                          "Mauris hendrerit felis non aliquam elementum. "
                          "Phasellus ut purus ut urna consequat commodo. "
                          "Cras semper ac augue quis rutrum. "
                          "Nunc tristique magna sit amet congue faucibus.");

        layout.addComponent(label1);
        layout.addComponent(label2);

        label1.setWidth(null);
        label2.setWidth("100%"); // I'm being explicit, but you can just as well leave this out if you like

        setContent(layout);
    }
}
  

Комментарии:

1. Это абсолютно правильный ответ! Я никогда не пробовал эту комбинацию. Я нашел другое решение, которое является более сложным, но имеет тот же запрошенный эффект. Это комментарий Jouni Koivuviita к ссылке . Он предлагает ссылаться на пользовательский класс CSS, который позволяет перенос слов. Java: label2.addStyleName("wrap"); , CSS: .v-label-wrap { white-space: normal; }