Megosztanék pár hasznos apróságot, melyet a Java programozás során használtam ma fel, hátha más is rákeres, és akkor magyarul is meglesz. Persze nekem is jó, ha később tudom, hova mentettem őket, úgyhogy double win 🙂
Tartalomjegyzék
JDialog kiikszelésének letiltása (bezárás a sarokban lévő gombbal)
https://stackoverflow.com/questions/1772905/disabling-the-close-x-in-a-joptionpane
Ezt az alapértelmezést kell átírni:
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
erre:
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
További infó a lehetséges értékekről: https://docs.oracle.com/javase/7/docs/api/javax/swing/WindowConstants.html
Azért akartam letiltani az X-szel történő bezárást, mert a dialógust a két gombjával is dispose() utasítással zártam be, és a gombtól függően léptem tovább. Ebbe zavart bele az ablak kiikszelése, ugye az az általam hozzáadott két gomb egyikéhez sem kapcsolódik. Végül nem tiltottam le, mert nem igazán felhasználóbarát, ha a user nem tudja bezárni az ablakot, hiába kattint vadul az X-re. Ettől függetlenül hasznos infó.
JFrame maximális méretű megnyitása
A szoftverem megnyitásakor a JFrame csak a képernyő felét foglalta el, érdemes lett hát kitenni full méretre. Mivel a képernyő felbontása mindenkinél más, ezért én is univerzális megoldást kerestem.
Felvettem ezt:
Dimension diMax = Toolkit.getDefaultToolkit().getScreenSize();
A NetBeans szerkesztőben pedig a JFrame -> jobb gomb, Properties-en belül a preferredSize értéket kellett szerkeszteni. Ott a Set Form’s preferredSize property using lehulló menüből a Custom code lehetőséget választottam, majd beírtam oda a diMax-ot:
Form.setPreferredSize(diMax);
És kész is. Bár ahogy látom, a Start menü alá is belóg a JFrame, így ennek még jobban utána kell néznem. Egyelőre nem zavar, mert olyan alulra nem íratok ki semmit.
JTable feltöltése adattal List segítségével
Nagyjából ezzel kezdtem a mai munkát, hogyan tudom a listában meglévő adatokat átadni a táblának? Ehhez itt találtam segítséget: https://stackoverflow.com/questions/11095802/populate-jtable-using-list
Első lépésben NetBeans vizuális szerkesztőjében feltettem egy JTable elemet a dialógusablakra.
Utána forráskód nézetben hozzáadtam egy új adattagot: private DefaultTableModel dtm;
Majd beállítottam a táblamodell oszlopait, és végig iteráltam a listát. A lista elemeiből egyenként létrehoztam egy-egy Object-et, amit az addRow metódussal hozzáadtam a táblamodellhez. https://docs.oracle.com/javase/7/docs/api/javax/swing/table/DefaultTableModel.html#addRow(java.lang.Object[])
dtm = new DefaultTableModel(); dtm.addColumn("ID"); dtm.addColumn("név"); dtm.addColumn("érték"); dtm.addColumn("belföldi?"); for (Vat vat : this.vats) { Object[] obj = new Object[4]; obj[0] = vat.getVatId(); obj[1] = vat.getAbbr(); obj[2] = vat.getValue(); obj[3] = vat.isDomestic(); dtm.addRow(obj); } initComponents();
Nekem nagyon tetszett a végeredmény.
JTable kiválasztott sorának egyik értékének lekérdezése
Le kellett kérdeznem a feldobott dialógusablak táblázatának azt a sorát, amit az user kijelölt, és a sorból szükségem volt az ID-re az adatbázis lekérdezéshez. Az ötletet ez adta: https://stackoverflow.com/questions/29345792/java-jtable-getting-the-data-of-the-selected-row
A feldobott dialógusablakban csináltam egy publikus getSelectedId() metódust, mely visszaadja ezt az ID-t.
Érdekes módon úgy találtam, hogy a kiválasztott sort a JTable-től tudom lekérni, az én elementsTable nevű táblázatom így mondta meg, melyik sorát választotta az user:
elementsTable.getSelectedRow();
A sor megfelelő celláját viszont a táblamodel mondta el:
dtm.getValueAt(elementsTable.getSelectedRow();
Ráadásul ez az érték Object volt, amit átalakítottam Stringgé a lekérdezéshez.
public String getSelectedId() { return dtm.getValueAt(elementsTable.getSelectedRow(), 0).toString(); }
A felhasználását pedig így oldottam meg:
1. Az aktuális dialógusablakomból feldobtam az új dialógusablakot, megkapta a listát.
2. Ezt betöltötte a táblázatba, a felhasználó kiválasztott egy sort, és megnyomta a két gomb valamelyikét.
3. Mindegyik gombon volt egy dispose(), hogy akármelyik műveletet válassza a user, bezáródjon a feldobott ablak.
4. A bezárt ablakból a getSelectedId segítségével megkaptam a szükséges ID-t, és annak megfelelően, hogy a felhasználó melyik gombot nyomta, elvégeztem a továbbiakat. (Az egyik a Törlés, a másik a Szerkesztés gomb volt).
Ezekről hamarosan bővebben is írni fogok, még a mentoromra várok, mert a legutóbbi konzultáció pont elmaradt a május 1 miatt.