[Java lista] JTable adatainak beírása lassú-Tabla oszlopsorrend , szélessége, lementése és hasonlók

Fábián Zoltán fz at szily.hu
2006. Nov. 11., Szo, 00:18:54 CET


Kösz, ezeket ezeket végignézem.
Fabio


--------
Fábián Zoltán
http://fz.szily.hu
-----Original Message-----
From: javalist-bounces at javagrund.hu [mailto:javalist-bounces at javagrund.hu]
On Behalf Of istvan.ketler at lhsystems.com
Sent: Friday, November 10, 2006 1:09 PM
To: javalist at javagrund.hu
Subject: Re: [Java lista]JTable adatainak beírása lassú-Tabla oszlopsorrend
, szélessége, lementése és hasonlók

Szia,

a következő átgondolását javaslom Neked, mert nem pontosan értem, miért
vesződsz olyasmivel, amit az API alapból tud. Vagy elnéztem valamit, és
extra viselkedésre is szükséged lenne?

A DefaultTableColumnModel teljesen jól kezeli ezeket a problémákat, a
JTableHeader-ben pedig ha engedélyezed az áthelyezést, akkor megoldja azt
Neked. A TableModel-nek nem kell tudnia arról, hogy egy adott oszlop éppen
hányadikként jelenik meg, ő csak szépen adja oda azt az oszlopot, amit
kérnek tőle. Majd a DefaultTableColumnModel megoldja azt, hogy a
removeColumn-olt oszlopok ne legyenek láthatók, illetve elvégzi az oszlopok
sorrendjének megváltoztatását is. Arról kell csak gondoskodnod, hogy
addColumn után az újonnan hozzáadott oszlop, amely alaphelyzetben a végére
kerül, visszakerüljön a helyére. Ehhez pedig a moveColumn metódust kell
használnod. Kell még ezen kívül TableColumn referencia valamennyi oszlopra
(a nem láthatókra is), hogy újra hozzá tudd adni őket a táblához, ha
szükséges. Ez nem is baj, mert így rögtön megvan Neked a user által
beállított legutóbbi szélessége is.

Trick: a model index (getModelIndex) soha nem változik a TableColumn esetén.
Ezt is használhatod a visszahelyezésekor. Használhatod továbbá a
setIdentifier és getIdentifier metódusokat, amelyekben tárolsz valamilyen
hivatkozást, aminek alapján vissza tudod majd tenni a helyére, ha szükséges.
(pl. van egy listád, amiben a NEM LÁTHATÓ oszlopok is benne vannak, s ha a
felhasználó áthelyez egy oszlopot, akkor a listát is frissíted mondjuk úgy,
hogy a beszúrást közvetlenül az utolsó látható MÖGÉ végzed el).

Trick: volt egy olyan bug, hogy a table.sizeColumnsToFit(-1) hívást ki
kellett adni oszlop hozzáadása/törlése után. Nem tudom, hogy kell-e még,
vagy kijavították már.

Magyarán: a lekérdezésnél mindig elkérsz minden lehetéges oszlopot, és a
ColumnModel fogja megoldani, hogy közülük csak az legyen látható, amelyiknek
kell. A TableModel mindig az összes lehetséges oszlop odaadására fel van
készülve.

Remélem, nem értettem el, mit is akarsz valójában. Nem értem ugyanis, hogy
miért kellene a küldött kódod. Max. arra lehet még szükség, ha a nulladik
oszlop nem helyezhető át, akkor ez legyen meggátolva. Erre azt javaslom, ha
nem baj az, hogy ez nem vesz részt a scrollozásban, hogy tedd őt zárolt
oszloppá. Ekkor fizikailag egy másik tábla fogja kezelni, így csak a többi
oszlop lesz áthelyezhető. (Az adatmodell viszont mindkét tábla mögött
ugyanaz!)

Üdvözlettel,

Iván

> -----Original Message-----
> From: javalist-bounces at javagrund.hu
> [mailto:javalist-bounces at javagrund.hu] On Behalf Of Fábián Zoltán
> Sent: Thursday, November 09, 2006 8:03 PM
> To: javalist at javagrund.hu
> Subject: Re: [Java lista]JTable adatainak beírása lassú-Tabla 
> oszlopsorrend , szélessége, lementése és hasonlók
> 
> Nem közvetlenül, de nekem ehhez kapcsolódó a kérdés. 
> A korábbi levelemben működő JTable. A kuncsaft azt szeretné, hogy 
> ahogy előzőleg hagyta az átrendezett oszlopok sorrendjét, 
> láthatóságát, szélességét, másnap ugyanúgy jelenjen meg a táblája.
> 
> - Láthatóságot úgy oldottam meg, hogy 0-ra állítom a láthatatlant. 
> Ennél van-e jobb, figyelembe véve, ha a modellből kiveszek vagy 
> hozzáadok egy oszlopot, akkor kezelnem kell a szerveroldali lekérdezés 
> oszlopneveit is.
> 
> - A szélességét kezelése külön tömbben lekérdezem - tiszta sor és 
> elmentem a szerver oldalon.
> 
> A sorrend volt a legnagyobb szívás, nem is tetszik. 
> Írtam egy listener-t (minta lapján) Amikor az egérrel elviszem az 
> oszlopot, akkor a háttérben elmozdul egy másik oszlop is az ellenkező 
> irányba és jön az esemény, amit lekell kezelni.
> A módosult oszlopindexeket lementem egy tömbbe és ezt tárolom a 
> szerveren.
> 
> Az ID oszlopot (0.) nem szabad átrendezni, mert ráadásul nem is 
> látható, ezért ha azt akarják átmozgatni, ki kell kapcsolni az 
> újrarendezhetőséget, majd vissza miután elmúlt a veszély.
> 
> A fentiekre van valami jó megoldása, ötlete valakinek, különösen az 
> oszlopsorrendre?
> 
> Fabio
> 
> A kódrészlet az oszlopok átrendezésére
> 
> private class MyTableColumnModelListener implements 
> TableColumnModelListener {
> 	...    
>       public void columnMoved(TableColumnModelEvent e) {
> 
> 		int fromIndex = e.getFromIndex();	//A látható
> dataindexe!
>             int toIndex = e.getToIndex();		//Az eredeti
> modellindex
> 
> 		//Ha csak a sorrend változott, akkor nem kell újraszámolni
az 
> oszlopokat
> 		if(fromIndex == toIndex) return;
> 			
> 		JTableHeader h = Table.getTableHeader();
> 		boolean re = h.getReorderingAllowed();
> 		if(  (re) &&
> 			 (toIndex != fromIndex) && 		// Ha a
> háttérben megy az átvonszolás
> 			 (  (toIndex == 0) || 			// Ha a
> táttér a 0.  oszlopba akar rándulni
> 				(toIndex == 1) || 		// Ha a
> háttér az első oszlopba akar rándulni
> 				(fromIndex==1 && toIndex == 2))
> //Ha az ID
> oszlop jobbra akarna mozdulni
> 		)
> 		{
> 			h.setReorderingAllowed(false);
> 			Table.moveColumn(toIndex, fromIndex);
> 			ut.test("Az ID oszlop nem mozdulhat a helyéről");
> 		}else{
> 			if(re){
> 				//Ide akkor jön, ha lehet oszlopokat
csereberélni
> 				setTableColOrder(col_order);
> //Oszlopsorrend lementése tömbbe
> 				h.setReorderingAllowed(true);
> 			}else{
> 				//Itt akkor van, amikor a 0. 
> és/vagy az első
> oszlopot cseréli vissza!
> 				h.setReorderingAllowed(true);
> 			}
> 		}
> 		
>             // fromIndex and toIndex identify the range of columns 
> being moved.
>             // In the case of a user dragging a column, this event is 
> fired as
>             // the column is being dragged to its new position. Also, 
> if the
>             // column displaces another during dragging, the fromIndex 
> and
>             // toIndex show its new position; this new position is 
> only
>             // temporary until the user stops dragging the column.
>         }
>     
>         public void columnMarginChanged(ChangeEvent e) {
>             // The width of some column has changed.
>             // The event does not identify which column.
> 		TableColumn column =
> Table.getTableHeader().getResizingColumn();
> 		if(column == null) return;
> 			
> 		int idx = column.getModelIndex();
> 		int i = ViewPhysIndex(idx,col_text);
> 		col_width[i] = column.getWidth();
>         }
> }
> 
> _______________________________________________
> Javalist mailing list
> Javalist at javagrund.hu
> http://javagrund.hu/mailman/listinfo/javalist
> 
_______________________________________________
Javalist mailing list
Javalist at javagrund.hu
http://javagrund.hu/mailman/listinfo/javalist



További információk a(z) Javalist levelezőlistáról