[Java lista] Swing kérdés

istvan.ketler at lhsystems.com istvan.ketler at lhsystems.com
2011. Ápr. 7., Cs, 08:55:23 CEST


Szia,

mivel az adatbázis jócskán is megváltozhatott, ezért szerintem nem nagyon járható az insert és delete. Kivéve persze, ha az adatbázis változása kizárólag olyan jellegű, ami lehetővé teszi azt. Általános megoldásként viszont szerintem a TableDataChanged való ehhez a feladathoz.

Nagyjából így csinálnám:

1. selection info elmentése a saját selection objektumomba
2. adatbázis alapján datamodell frissítése
3. data changed event kilövése

Továbbá:
minden egyes selection változás esetén a saját selection objektumot frissíteném
a renderer a megjelenítéshez konzultálna a saját selection objektummal (nem használná az isSelected flaget).

A tábla saját selection modelljét csak beolvasás előtt használnám a saját modell tárolására.

Mivel az adatok adatbázisból jönnek, ezért feltételezem hogy létezik egyértelmű azonosító kód, ami az egyes sorok azonosítására alkalmas lehet. A saját selection ezeket tárolja, a renderer pedig ennek segítségével ellenőrzi a selectiont.

Azért vezetem be a saját selectiont, mert semmi nem garantálja, hogy a korábban kiválasztott sorok még mindig léteznek a táblában. Nagyobb mennyiségű adat esetén a teljes végigolvasás szerintem nem jó ötlet (főleg nem ha cache-elsz, és csak néhány lap van a memóriában, és lapozás közben frissítesz adatbázosból).

Hatos jáva esetén figyelj arra, hogy rendezhető tábla esetén konvertálásra lesz szükség a selection változás figyelése során (tábla sor van az event-ben, a modellben pedig a fizikai sorban van az adat).

Akkor elkezd nem túl jól működni, ha a felhasználó nagyon sok sort is kiválaszthat (lassú lesz a renderelés).

Biztos van, amit most így hirtelen elfelejtettem, de ennyire értem most rá a végiggondolásra.

Üdvözlettel,

Iván

István Ketler
Team Leader 
Lufthansa Systems Hungaria Kft. 
Airline Management Solutions 
- Schedule & Revenue Management 
- Business Intelligence & Database Solutions
Neumann János u. 1/e
1117 Budapest
Hungary 
Tel: +36 1 887-2815 
Fax: +36 1 887-2977
Mobile: +36 30 600-4936 
Room: Infopark E, Room LH1-31 
e-mail: istvan.ketler at lhsystems.com 
Internet: www.LHsystems.hu


 
Sitz der Gesellschaft / Corporate Headquarters: Lufthansa Systems Hungaria Kft, Budapest, Fövarosi Birosag 01-09-463417
Geschaeftsfuehrung / Management Board: Monika Houck

-----Original Message-----

From: javalist-bounces at javagrund.hu [mailto:javalist-bounces at javagrund.hu] On Behalf Of Csuhai Roland
Sent: Thursday, April 07, 2011 7:46 AM
To: javalist at javagrund.hu
Subject: Re: [Java lista] Swing kérdés

Üdv!

1: A fireTableDataChanged() metódust csak akkor használd ha szükséges.
Ez ugyanis törli a szelekciót, mivel a táblázat (modell) tartalmának
teljes változását feltételezi. Használd inkább a 
fireTableRowsInserted() és társait ehelyett.

2: Vagy a hívás előtt mentsd le a szelekciót (getSelectedRows()) és
állítsd be újra a
fireTableDataChanged() hívása után, amennyiben a korábban kiválasztott
entitásod még a táblázatban (modellben) van.

R.

---------------------------------------------------------
Csuhai Roland

Daten-Kontor Kft.
szoftverfejlesztő
---------------------------------------------------------
Email:		csuhai.roland at dk.hu
Mobil: 		+36 (30) 663-6138
Telefon:	+36 (72) 552-971
---------------------------------------------------------

-----Original Message-----
From: javalist-bounces at javagrund.hu
[mailto:javalist-bounces at javagrund.hu] On Behalf Of Mester József
Sent: Wednesday, April 06, 2011 8:24 PM
To: javalist at javagrund.hu
Subject: [Java lista] Swing kérdés

Tisztelt Swing guru lista tagok.

A feladat:
Adatbázisból időnként ki kell olvasni adatokat ezeket egy JTabléban 
szeretném megjeleníteni. Az adatokat adott időközönként kell kiolvasni

mondjuk 15 percenként.
A JTable -ben levő adatoknak ezután frissülniük kell. Közben a 
felhasználó kiválaszthat adatokat amelyekről részletesebb adatokat
kell 
kiírni.
Eddig oda jutottam el, hogy a JTable-ben levő adatok frissítéséhez 
csináltam egy saját TableModel-t ebben van egy update() metódus ami 
meghívja a JPA lekérdezést és az onnan kapott
listát betölt a TableModel-be. Ezután fireTableDataChanged() hívással 
elméletileg tudatja a "világgal" , hogy a model-ben megváltoztak az
adatok.
Ez hibátlanul működik mindaddig amíg valaki nem kattint egy sorra,
hogy 
onnan adatokat kapjon.

public void valueChanged(ListSelectionEvent e) {
             selrow = EmberTable.getSelectedRow();
             kiiras = EmberTable.getModel().getValueAt(selrow, 1)+ " "
+ 
selrow;
             System.out.println("selrow értéke : "+ selrow);
             JOptionPane.showMessageDialog(EmberTable, kiiras);
         }

Itt a visszadott érték kiíratása világosan mutatja, hogy először jól 
vissza adja a program a valós értéket, majd rögtön utána egy -1 -et 
amitől rögtön dob egy
Exception in thread "AWT-EventQueue-0" 
java.lang.ArrayIndexOutOfBoundsException: -1
         at java.util.Vector.get(Vector.java:696)

ilyet.
Ha nem kellene 15 percenként újraolvasni az adatokat akkor tudnám a 
megoldást. Ha nem kellene engedni a júzert, hogy kattingasson akkor
is.
De a kettő együtt nem megy .:-(

Merre induljak el?
_______________________________________________
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