powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF сложная таблица
21 сообщений из 21, страница 1 из 1
JSF сложная таблица
    #37681791
sjinks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Товарищи специалисты, стоит задача о формировании сложной таблицы в JSF. Примерный вид таблицы показан в аттачменте. Сложность заключается в том, что каждая ячейка - значение из бд (таблицы item1 по значению item2) + оно должно быть кликабельным -- при клике на него должен вызываться попап с определенным контентом.
Кто поможет разобраться? Готового решения не жду, но может быть у кого есть какие мысли?
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37681833
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682026
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682119
sjinks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за варианты, буду пробовать. Сейчас остановился на простом создании динамической таблицы:

Страница жсф:
Код: java
1.
<h:panelGroup binding="#{summaryReportController.dynamicDataTableGroup}"/>



Кусок класса контроллера:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
	private List<SumReport> sumReports;
	private String[] summaryTableHeaders;
	private HtmlPanelGroup dynamicDataTableGroup;
	
	private void loadDynamicList(){
		Expenses[] expenses = getExpensesDaoImpl().getExpenses();
		summaryTableHeaders = new String[expenses.length];
		for(int i=0; i<expenses.length; i++){
			summaryTableHeaders[i]=expenses[i].getName();
		}
		//System.out.println("EXPENSES ARRAY SIZE "+expenses.length);
		sumReports = new ArrayList<SumReport>();
		for(int i=0;i<expenses.length;i++){
			SumReport sumReport = new SumReport();
			ExpenseLog[] expLogs = getExpensesDaoImpl().getExpLog(expenses[i].getExpenseId());
			float summaryAmount=0;
			for(int j=0;j<expLogs.length;j++){
				summaryAmount+=expLogs[j].getAmount();		
				sumReport.setExpAmount(summaryAmount);
			}
			sumReports.add(sumReport);
		}
	}
	
	private void populateDynamicDataTable(){
		HtmlDataTable dynamicDataTable = new HtmlDataTable();
		dynamicDataTable.setValueExpression("value", FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression("#{summaryReportController.sumReports}", String.class));
		dynamicDataTable.setVar("dynamicItem");
		
		for(int i=0; i<sumReports.size();i++){
			System.out.println("SUMREPORTS SIZE ="+sumReports.size());
			System.out.println("HEADERS SIZE ="+summaryTableHeaders.length);
			HtmlColumn column = new HtmlColumn();
			dynamicDataTable.getChildren().add(column);
			
			HtmlOutputText header = new HtmlOutputText();
			header.setValue(summaryTableHeaders[i]);
			column.setHeader(header);
			
			HtmlOutputText output = new HtmlOutputText();
			output.setValueExpression("value", FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression("#{dynamicItem["+i+"]}", String.class));
			column.getChildren().add(output);
		}
		
		dynamicDataTableGroup = new HtmlPanelGroup();
		dynamicDataTableGroup.getChildren().add(dynamicDataTable);
	}
	
	public HtmlPanelGroup getDynamicDataTableGroup(){
		if(dynamicDataTableGroup==null){
			loadDynamicList();
			populateDynamicDataTable();
		}
		return dynamicDataTableGroup;
	}

	public void setDynamicDataTableGroup(HtmlPanelGroup dynamicDataTableGroup) {
		this.dynamicDataTableGroup = dynamicDataTableGroup;
	}

	public List<SumReport> getSumReports() {
		return sumReports;
	}



На выходе имею то, что в аттачменте. Я так понимаю, дело в строке
Код: java
1.
output.setValueExpression("value", FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression("#{dynamicItem["+i+"]}", String.class));



Подскажите, что не так?
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682154
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sjinksПодскажите, что не так?
дизайн ужасный.
Размер картинок твоих больше 1000 пикселей с молоком.
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682412
sjinks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, вот так поменьше будет.
При чем здесь дизайн сейчас?
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682538
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, почему
Код: html
1.
dynamicDataTable.setValueExpression("value", FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression("#{summaryReportController.sumReports}", String.class));


#{summaryReportController.sumReports} возвращает List<SumPeport>, то есть по идее это уже неправильно, я думаю нужно так

Код: html
1.
FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression("#{summaryReportController.sumReports}", List.class));



Далее, то же самое с dynamicItem, каждый dynamicItem это объект SumReport, то есть запись #{dynamicItem[i]} как бы теряет смысл. допустим вам надо вывести expAmount у вашего SumReport, тогда правильный valueExpression это
Код: html
1.
output.setValueExpression("value", FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression("#{dynamicItem.expAmount}", Float.class));



И третье, почему вы биндите panelGroup а не саму datatable? Ведь вы можете значительно сократить java код, сделав примерно так:

Код: html
1.
<h:datatable binding="#{summaryReportController.dynamicDataTable}" var="dynamicItem" value="#{summaryReportController.sumReports}"/>


private List<SumReport> sumReports;
private String[] summaryTableHeaders;
private HtmlDataTable dynamicDataTable;
private boolean loaded;
private void populateDynamicDataTable(){

for(int i=0; i<sumReports.size();i++){
HtmlColumn column = new HtmlColumn();
dynamicDataTable.getChildren().add(column);

HtmlOutputText header = new HtmlOutputText();
header.setValue(summaryTableHeaders[i]);
column.setHeader(header);

HtmlOutputText output = new HtmlOutputText();
output.setValueExpression("value", FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression("#{dynamicItem.expAmount}", Float.class));
column.getChildren().add(output);
}
}

public HtmlPanelGroup getDynamicDataTable(){
if(loaded){
loadDynamicList();
populateDynamicDataTable();
}
return dynamicDataTable;
}

public void setDynamicDataTable(HtmlPanelGroup dynamicDataTable) {
this.dynamicDataTable = dynamicDataTable;
}

public List<SumReport> getSumReports() {
return sumReports;
}

//----------------------Convinience methods for reload dataTable
public boolean isLoaded(){
return loaded;
}
//setLoaded
........
//Call this like actionListener=#{summaryReportController.needReload} when you need reload datatble
public void needReload(){
setLoaded(false);
}

[SRC java][/SRC]
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682549
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, java код выскочил из своей секции )

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
private List<SumReport> sumReports;
private String[] summaryTableHeaders;
private HtmlDataTable dynamicDataTable;
private boolean loaded;
private void populateDynamicDataTable(){

for(int i=0; i<sumReports.size();i++){
HtmlColumn column = new HtmlColumn();
dynamicDataTable.getChildren().add(column);

HtmlOutputText header = new HtmlOutputText();
header.setValue(summaryTableHeaders[i]);
column.setHeader(header);

HtmlOutputText output = new HtmlOutputText();
output.setValueExpression("value", FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression("#{dynamicItem.expAmount}", Float.class));
column.getChildren().add(output);
}
}

public HtmlPanelGroup getDynamicDataTable(){
if(loaded){
loadDynamicList();
populateDynamicDataTable();
}
return dynamicDataTable;
}

public void setDynamicDataTable(HtmlPanelGroup dynamicDataTable) {
this.dynamicDataTable = dynamicDataTable;
}

public List<SumReport> getSumReports() {
return sumReports;
}

//----------------------Convinience methods for reload dataTable
public boolean isLoaded(){
return loaded;
}
//setLoaded
........
//Call this like actionListener=#{summaryReportController.needReload} when you need reload datatble
public void needReload(){
setLoaded(false);
}
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682556
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А и еще не досмотрел сигнатуры методов
public HtmlPanelGroup getDynamicDataTable() и setDynamicDataTable() нужно поменять панелГруп на дататейбл
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682688
sjinks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, попробовал Ваш вариант. Касательно его ошибок пока нет, но жсф выдает другую (более странную):
авторProperty 'dynamicDataTableGroup' not found on type com.mycompany.SummaryReportController
хотя такой проперти и в помине нет в бине (все закоменчено)
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682726
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нет тут ничего странного, jsf не находит #{summaryReportController. dynamicDataTableGroup }, внимательно посмотрите ваш код на наличие этого выражения, и если есть - уберите, и внимательно посмотрите то что я советовал, по сути я изменил <h:panelGroup binding="#{summaryReportController.dynamicDataTableGroup}"/>
на <h:datatable binding="#{summaryReportController. dynamicDataTable }" var="dynamicItem" value="#{summaryReportController.sumReports}"/>
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682729
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторхотя такой проперти и в помине нет в бине (все закоменчено)

Я имею ввиду где-то на странице есть #{summaryReportController.dynamicDataTableGroup}
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682764
sjinks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Он, в принципе, был закоменчен и на странице, но убрал и ошибка пропала, но это не важно, потому что теперь вообще ничего не выводиться кроме статических эл-в, в моем варианте хотя бы хедеры были:)
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682802
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто фейслеты обрабатывают комментарии в том числе, чтобы фейслеты не обрабатывали часть страницы, надо не комментить, а обрамлять в ui:remove.


Далее, что дебаг показывает? И попробуйте все же свой вариант с panelGroup, только createValueExpression поправьте, как я советовал - что тогда произойдет?
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682827
sjinks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторCannot convert #{summaryReportController.sumReports} of type class java.lang.String to interface java.util.List

Вот что получается, в моем модифицированном Вами варианте, поэтому я и лепил стринг вместо листа...
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682880
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати я тут подумал, а зачем вам вообще эта возня с биндингами. Что такого сложного в вашей модели?

если не сложно, можете набросать эскиз того что вам нужно вывести в таблице(и укажите тип каждого обьекта)? Например так -

хеадер1(#{sumReport[1].text}) | хеадер2(#{sumReport[2].text}) | хеадер3(#{sumReport[3].text})
значение1(#{sumReport[1].value}) | значение2(#{sumReport[2].value}) | значение3(#{sumReport[3].value})


Я просто не совсем понимаю что вам нужно вывести, и есть ощущение, что все довольно просто решается
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682899
sjinks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник , загляните, пожалуйста, к себе на почту :)
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37682900
sjinks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...что указана у Вас в профайле
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37683891
sjinks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник , ну раз в личном порядке не получается -- задача стоит такая:
авторСводный отчет представляется таблицей, где имеющиеся в справочниках статьи расходов размещены в колонках, а филиалы – в строках. Кроме этого, таблица имеет итоговую колонку и итоговую строку.
При щелчке мыши на каком-либо значении в поле таблицы кроме итоговых, должно появляться модальное окошко с расшифровкой выбранного значения по массиву первичных данных, такой структуры
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37684763
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sjinks, Имхо вам нужно немного реорганизовать модель, если я вас правильно понял, то вы можете сделать по примеру:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Controller {

	private List<String> headers;
	public List<String> getHeaders() {
		if(headers == null){
			headers = new ArrayList<String>();
			Branch branch = getBranches().get(0);
			for(Expense expense : branch.getExpenses()){
				headers.add(expense.getDescription());
			}
		}
		return headers;
	}

	public List<Branch> getBranches() {
		if(branches == null){
			//loadBranches();
		}
		return branches;
	}

	private List<Branch> branches;
	
}

class Branch{
	private String name;
	public String getName() {
		return name;
	}
	public List<Expense> getExpenses() {
		if(expenses == null){
			expenses = Arrays.asList(getExpensesDaoImpl().getExpenses());
		}
		return expenses;
	}

	public float getSumAmount() {
		float sumAmount = 0;
		for(Expense expense: getExpenses()){
			sumAmount += expense.getAmount();
		}
		return sumAmount;
	}
	private List<Expense> expenses;

}

class Expense{
	private float amount;
	private String description;
	public float getAmount() {
		return amount;
	}
	public String getDescription() {
		return description;
	}
}



Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<h:dataTable value="#{controller.branches}" var="branch">
	<h:column>
		<f:facet name="header" >
			<h:outputText value="Branch name:"/>
		</f:facet>    
		<h:outputText value="#{branch.name}"/>
	</h:column>
	<ui:repeat value="#{branch.expenses}" var="expense">
		<h:column>
			<h:outputText value="#{expense.amount}" />
		</h:column>
	</ui:repeat>
	<h:column>
		<f:facet name="header" >
			<h:outputText value="Total:"/>
		</f:facet>    
		<h:outputText value="#{branch.sumAmount}"/>
	</h:column>
</h:dataTable>



Если есть какие-то вопросы - спрашивайте
...
Рейтинг: 0 / 0
JSF сложная таблица
    #37684863
sjinks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.Возможно, для полного понимая моей модели нужно будет глянуть ее полностью. Если есть возможность, киньте мне свои контакты для связи dt.dev91 (dog) gmail.com
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF сложная таблица
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]