[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