Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF сложная таблица / 21 сообщений из 21, страница 1 из 1
28.02.2012, 12:12:44
    #37681791
sjinks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
Товарищи специалисты, стоит задача о формировании сложной таблицы в JSF. Примерный вид таблицы показан в аттачменте. Сложность заключается в том, что каждая ячейка - значение из бд (таблицы item1 по значению item2) + оно должно быть кликабельным -- при клике на него должен вызываться попап с определенным контентом.
Кто поможет разобраться? Готового решения не жду, но может быть у кого есть какие мысли?
...
Рейтинг: 0 / 0
28.02.2012, 12:30:43
    #37681833
GregTk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
...
Рейтинг: 0 / 0
28.02.2012, 13:44:09
    #37682026
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
...
Рейтинг: 0 / 0
28.02.2012, 14:18:26
    #37682119
sjinks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
Спасибо за варианты, буду пробовать. Сейчас остановился на простом создании динамической таблицы:

Страница жсф:
Код: 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
28.02.2012, 14:29:52
    #37682154
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
sjinksПодскажите, что не так?
дизайн ужасный.
Размер картинок твоих больше 1000 пикселей с молоком.
...
Рейтинг: 0 / 0
28.02.2012, 15:49:10
    #37682412
sjinks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
Сорри, вот так поменьше будет.
При чем здесь дизайн сейчас?
...
Рейтинг: 0 / 0
28.02.2012, 16:24:17
    #37682538
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
Во-первых, почему
Код: 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
28.02.2012, 16:26:25
    #37682549
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
Блин, 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
28.02.2012, 16:27:44
    #37682556
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
А и еще не досмотрел сигнатуры методов
public HtmlPanelGroup getDynamicDataTable() и setDynamicDataTable() нужно поменять панелГруп на дататейбл
...
Рейтинг: 0 / 0
28.02.2012, 17:00:36
    #37682688
sjinks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
Спасибо, попробовал Ваш вариант. Касательно его ошибок пока нет, но жсф выдает другую (более странную):
авторProperty 'dynamicDataTableGroup' not found on type com.mycompany.SummaryReportController
хотя такой проперти и в помине нет в бине (все закоменчено)
...
Рейтинг: 0 / 0
28.02.2012, 17:11:07
    #37682726
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
А нет тут ничего странного, jsf не находит #{summaryReportController. dynamicDataTableGroup }, внимательно посмотрите ваш код на наличие этого выражения, и если есть - уберите, и внимательно посмотрите то что я советовал, по сути я изменил <h:panelGroup binding="#{summaryReportController.dynamicDataTableGroup}"/>
на <h:datatable binding="#{summaryReportController. dynamicDataTable }" var="dynamicItem" value="#{summaryReportController.sumReports}"/>
...
Рейтинг: 0 / 0
28.02.2012, 17:12:04
    #37682729
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
авторхотя такой проперти и в помине нет в бине (все закоменчено)

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


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

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

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

хеадер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
28.02.2012, 18:01:10
    #37682899
sjinks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
забыл ник , загляните, пожалуйста, к себе на почту :)
...
Рейтинг: 0 / 0
28.02.2012, 18:01:23
    #37682900
sjinks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
...что указана у Вас в профайле
...
Рейтинг: 0 / 0
29.02.2012, 12:17:49
    #37683891
sjinks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
забыл ник , ну раз в личном порядке не получается -- задача стоит такая:
авторСводный отчет представляется таблицей, где имеющиеся в справочниках статьи расходов размещены в колонках, а филиалы – в строках. Кроме этого, таблица имеет итоговую колонку и итоговую строку.
При щелчке мыши на каком-либо значении в поле таблицы кроме итоговых, должно появляться модальное окошко с расшифровкой выбранного значения по массиву первичных данных, такой структуры
...
Рейтинг: 0 / 0
29.02.2012, 16:44:00
    #37684763
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
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
29.02.2012, 17:37:14
    #37684863
sjinks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF сложная таблица
Спасибо.Возможно, для полного понимая моей модели нужно будет глянуть ее полностью. Если есть возможность, киньте мне свои контакты для связи dt.dev91 (dog) gmail.com
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF сложная таблица / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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