Компонент Vaadin добавлен дважды по какой-то причине

#java #vaadin

#java #vaadin

Вопрос:

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

Это соответствующий код:

         AbstractComponent horizontalLine = Cf.horizontalLine();
        horizontalLine.addStyleName("m2m-horizontal-line-list-separator");
        horizontalLine.setWidth("100%");
        horizontalLine.setParent(null);
        SVerticalLayout spacer = Cf.vLayout(new SLabel(""));
        spacer.setMargin(true);

        CssLayout cssLayout = new CssLayout();

        cssLayout.addStyleName("m2m-css-style");
        cssLayout.addComponent(inventoryFilterPanel);
        cssLayout.addComponent(horizontalLine);
        cssLayout.addComponent(simCardTable);

        Panel basePanel = new Panel("");
        basePanel.setContent(cssLayout);
        basePanel.addStyleName("m2m-base-panel");
        basePanel.setSizeFull();
        basePanel.getContent().setSizeUndefined();

        addStyleName("m2m-tab-main-view");
        setMargin(false);
        addComponent(basePanel);
        setExpandRatio(basePanel, 1);
  

РЕДАКТИРОВАТЬ: добавление соответствующего CSS:

 .m2m-horizontal-line-list-separator {
    width: 97%;
    margin-top: 20px;
    margin-bottom: 20px;
}

.m2m-css-style {
    margin: 10px;
}

.v-panel-content-m2m-base-panel .v-verticallayout  {
    min-width: 100%;
}

.m2m-tab-main-view {
/**Didn't have any CSS inside it*/
}
  

РЕДАКТИРОВАТЬ 2: Изображение, показывающее проблему

введите описание изображения здесь

РЕДАКТИРОВАНИЕ 3: снимок экрана сгенерированной разметки из Firebug

введите описание изображения здесь

В разметке вы видите: -Панель, содержащую CssLayout. -Внутри CssLayout у нас есть первый экземпляр строки, которого там не должно быть, который также отмечен. -Следующий div — это VerticalLayout, который содержит filterPanel. -Далее у нас есть строка, правильная, и — наконец, у нас есть таблица.

Абстрактный компонент ‘horizontalLine’ работает как разделитель для разделения компонента filterPanel и таблицы. Согласно коду, он добавлен один раз, однако по какой-то странной причине в браузере он добавлен два раза. Один экземпляр добавляется туда, где я хочу, чтобы он был, а другой добавляется в верхнюю часть CssLayout, поверх всего остального! Сумасшедший, верно!? = P

Я понятия не имею, почему это так. Как вы видите из кода, существует только один его экземпляр, и он добавляется только один раз…. Кто-нибудь имеет представление о том, что происходит?

Спасибо! / Макс

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

1. Может быть, вы добавляете еще один компонент inventoryFilterPanel?

2. @Yuri Ну, теперь это было бы неловко, не так ли ..? =) Но нет, строка добавляется только один раз во всем коде … =

Ответ №1:

Довольно сложно сказать, что происходит из предоставленного вами кода. Я предполагаю, что CSS, который фактически отображает горизонтальную линию, перетекает в какой-то другой компонент / макет, или у вас ошибка в ваших правилах CSS.

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

HTH, / Jonatan

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

1. Привет, Джонатан, и спасибо за ваш ответ! Я добавил то, что, как я полагаю, будет всем соответствующим кодом. Если вы чувствуете, что чего-то не хватает, пожалуйста, скажите мне!

2. Не могу найти ничего плохого в вашем коде, и теперь, когда я вижу, как выглядит DOM, мое предположение было неверным. Вы уверены, что опубликованный вами код на самом деле является кодом, который генерирует макет? Попробуйте изолировать проблему в небольшом приложении, это обычно помогает.

3. Я почти уверен, что опубликованный мной код является соответствующим кодом. Глядя на CSS и распечатку Firebug, они, похоже, отлично коррелируют. В CssLayout на изображении есть четыре (должно быть три) компонента, а в CssLayout на распечатке есть четыре div. Это было то, что вы задавались вопросом?

Ответ №2:

Только теперь я заметил, что вы устанавливаете свой макет как новый макет панели. В вашем CSS-стиле «m2m-base-panel» может быть, не перезаписывайте некоторые базовые стили панели, рисуя границы вокруг макета содержимого панели.

 //This CSS part draw around Panel content layout border, 
//with I think you see "upper top of the cssLayout"        
.v-panel-content {
    border: 1px solid #BABFC0;
    //Some other style depends on with Vaadin theme you use
}
  

Попробуйте добавить в свой стиль панели Runo.PANEL_LIGHT или Reindeer.PANEL_LIGHT , это должно решить вашу проблему.

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

1. Вы спрашиваете, действительно ли верхняя строка может быть верхней частью границы панели ..? Тогда нет, это хорошая догадка, но это не так. Граница также есть, прямо над строкой. Я добавил изображение, показывающее проблему.

2. Можете ли вы проверить этот элемент в браузере и добавить «исходный код браузера» этого компонента строки, чтобы увидеть, что стиль был добавлен? Если стиль этой строки совпадает с нижней строкой, которая добавляет код компонента inventoryFilterPanel, возможно, внутри него что-то не так.

3. Странно. Хорошо, давайте попробуем сделать следующее. Прежде всего попробуйте поиграть с положением компонентов в макете, установив position index. CssLayout.AddComponent(inventoryFilterPanel,0); CssLayout.AddComponent(horizontalLine, 2); CssLayout.AddComponent(simCardTable, 1);

4. Если «строка» будет отображаться в неправильном месте, попробуйте использовать, например, VerticalLayout вместо CssLayout . Если это не сработает, попробуйте сделать что-то вроде этого: CssLayout.AddComponent(новая метка («тестовый тест»)); CssLayout.AddComponent(горизонтальная линия); CssLayout.AddComponent(новая метка («тестовый тест»)); CssLayout.AddComponent(горизонтальная линия); CssLayout.AddComponent(новая метка(«test test»)); В этом случае мы выясним, «подключена» ли эта дублированная строка к вашим компонентам на not. Жду вашего ответа.

5. Привет, Юрий. Я попытался использовать index, установив filter.index(0), line.index(1) и table.index(2), чтобы вторая строка была нарисована прямо рядом с первой строкой, а не на верхнем фильтре. Я попытался переключиться на другой компонент, new Label («ТЕСТИРОВАНИЕ»), это также появилось дважды, поэтому оно не должно иметь никакого отношения к компоненту line (плюс я использовал его в других случаях). переключение на vLayout вместо CSS не поможет, потому что vLayout был исходным макетом, когда я переключился на CSS, и проблема была там и тогда .. =