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

istvan.ketler at lhsystems.com istvan.ketler at lhsystems.com
2006. Nov. 10., P, 13:09:02 CET


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
> 


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