#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, и проблема была там и тогда .. =