[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