Pár hasznos apróság Java programozáshoz

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 🙂

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.

https://stackoverflow.com/questions/9460325/setting-the-maximum-size-of-a-jframe-while-launching-the-application

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.