[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