Sunteți pe pagina 1din 41

112

Alte controale Windows JPasswordField

Controlul de tip JPasswordField este folosit pentru preluarea parolelor. Proprietile sale sunt similare controlului de tip JTextField. Practic, ntr-o aplicaie care acceseaz o baz de date se preia o parol care este folosit ulterior la stabilirea nivelului de acces al utilizatorului aplicaiei. Astfel dac parola este a unui simplu operator care culege date o parte din elementele de control ale aplicaiei (opiuni din meniuri, butoane de pe barele cu instrumente sau coninute n formulare) devin inactive. Ele vor fi desigur activate dac parola introdus este cea a inginerului de baze de date care ntreine aplicia. ntre cele dou extreme pot fi definite diverse nivele de prioritate, fiecare cu caracteristicile sale.

JTextArea

Controlul de tip JTextArea se utilizeaz pentru introducerea irurilor de caractere lungi, pe mai multe linii. Proprietile folosite pentru accesarea coninutului sunt aceleai ca i n cazul controlul de tip JTextField.

JCheckBox Un control de tip caset de validare (JCheckBox) poate avea dou stri: selectat sau neselectat. Starea de selectare poate fi stabilit n momentul realizrii interfeei grafice sau n timpul execuiei aplicaiei, prin apelul metodei setChecked(). Testarea strii controlului se realizeaz prin apelul metodei isSelected(). Ca i n cazul controalelor de tip JButton, controlului de tip JCheckBox i se poate asocia o secven de tratare a evenimentului declanat la selectarea acestuia cu mouseul.

113

JRadioButton Cotroalele de tip JRadioButton (butoane radio) servesc la selectarea unei valori dintr-un set de valori posibile. Pentru a impune acest comportament naintea adugrii butoanelor de tip JRadioButton care vor compune un grup de butoane se va aduga interfeei un control de tip ButtonGroup. Pentru a realiza gruparea, se selecteaz succesiv, cu tasta Control apsat, butoanele radio care compun grupul i apoi, n fereastra de proprieti, se selecteaz pentru proprietatea buttonGroup numele obiectului de tip ButtonGroup adugat anterior.

Uneori metoda de tratare a evenimentului declanat la selectarea unuia dintre butoane trebuie s fie aceeai pentru toate butoanele care formeaz grupul.. Pentru a impune acest lucru se scrie metoda folosind unul dintre butoane, dup care se selecteaz succesiv butoanele i se editeaz numele dat implicit metodei de tratare a evenimentului actionPerformed.

114 Starea iniial a butoanelor, respectiv butonul care apare selectat la afiarea interfeei se impune folosind proprietatea selected a butoanelor. Evident, numai un buton din grup poate avea starea selectat. Ca i n cazul controalelor de tip JCheckBox, se poate modifica prin program starea de selectare a unuia dintre butoanele care formeaz grupul apelnd metoda setSelected() i se poate testa starea unuia dintre butoane prin apelul metodei isSelected().

Controale Windows cu list Componentele Swing folosite limbajul Java ncepnd cu versiunea 1.2

implementeaz arhitectura Model-View-Controller (MVC). Modelul MVC const n esen n separarea datelor de reperezentarea lor. Datele sunt coninute ntr-un obiect (model) asociat unui control Windows care realizeaz reprezentarea lor (view). Cea de-a treia component, Controller realizeaz interceptarea i procesarea evenimentelor.

Controller

View

Model

Aceast abordare st de altfel la baza independenei aplicaiilor Java de platforma pe care se execut aplicaia. Dac pentru controale simple obiectul care conine datele este realizat automat pentru controale complexe, care pot conine un numr mare i variat de obiecte (JComboBox, JList, JTable, JTree), programatorul poate opta ntre folosirea unui obiect aparinnd unei clase implicite (DefaultListModel, DefaultTableModel, DefaultTreeModel) i definirea unei clase proprii, derivat dintr-o clas abstract predefinit sau nederivat. Evident complextitatea programrii crete dac nu se folosete clasa implicit, dar n cazul unor reprezentri mai deosebite este singura soluie.

115 JComboBox Controlul de tip JComboBox permite selectarea unei valori dintr-o list predefinit. Definirea listei se realizeaz de obicei n etapa de proiectare a aplicaiei, coninutul acesteia fiind accesibil prin intermediul proprietii model, editat i dinamic, n timpul execuiei, folosind metodele: Lista poate fi construit i

Tip returnat void void Object int void void void int void

Metoda addItem(Object obj) insertItemAt(Object obj, int index) getSelectedItem() getSelectedIndex() removeAllItems() removeItem(Object obj) removeItemAt(int index) getItemCount()
setEditable()

Aciune Adaug un element n list Insereaz un element n list Returneaz ob. selectat Returneaz poz. elem. selectat Golete lista Suprim prima apariie a obj. Suprim el.. de la poziia index Returneaz nr. de elemente
n funcie de argument caseta de text va fi editabil sau needitabil

n aplicaiile destinate realizrii interfeei cu baze de date prezint un mare interes popularea listei prin preluarea valorilor dintr-o mulime de selecie, ca n exemplul urmtor: rezultat = comanda.executeQuery("SELECT * FROM edituri nume"); while (rezultat.next()) // Trec pe urmatoarea linie { // preiau numele String nm = rezultat.getString("nume"); listaed.addItem(nm); // listaed este un JComboBox } order by

Pentru a nsera o funcie de tratare a evenimentului produs la selectarea unui element folosind un control de tip JComboBox se procedeaz ca i n cazurile deja prezentate, respectiv se selecteaz controlul cu butonul drept al mouse-ului i n meniul contextual se selecteaz Events / Action:

116
private void listaedActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: // Copiez din combo in variabila numeed de tip String numeed = (String)listaed.getSelectedItem(); }

Exist situaii n care caseta de text a controlului trebuie s primeasc doar o parte din irul coninut n linia selectat. n exemplul urmtor s-a reinut n caseta de text doar primul element din irul de caractere coninut n linia selectat: private void listacitActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: // Preiau sirul de car. din lista String nm = (String)listaed.getSelectedItem(); // Separ subsirurile din sir String[] sir = nm.split(" "); listaed.setEditable(true); // caseta combo devine editabil listaed.setSelectedItem(sir[0]); // preiau numai primul element listaed.setEditable(false); // caseta combo devine needitabil . . . // In continuare urmeaza utilizarea valorii selectate }

Metoda split() a clasei String permite separarea unui ir de caractere ntr-un numr de subiruri, separatorii permii fiind dai ntr-un ir (al doilea argument). n exemplul prezentat irul folosit ca argument conine un spaiu. Pentru a impune valoarea din caseta de text a controlului combinat trebuie modificat tipul acestuia, din needitabil n editabil. Dup impunerea valorii se revine la starea iniial. Modificarea acestei proprieti se realizeaz folosind metoda setEditable().

Exemplu :

Se cere s se realizeze un formular pentru introducerea cititorilor

bibliotecii n tabelul Cititori avnd structura :

117
Cmpul COD_CIT fiind de tip autoincrement, este comod s se creeze pentru iniializarea lui cu valori corecte un obiect de tip sequence (secven). Declararea n Oracle XE a unui obiect de tip sequence se realizeaz selectnd Object Browser / Create / Sequence :

n noua fereastr se va defini numele obiectului (citi_seq), valoarea de start i incrementul.

Evidenierea funcionrii noului obiect se poate realiza tastnd o comand SQL SELECT.

118
Funcia NEXTVAL incrementeaz secvena cu o unitate iar funcia CURRVAL returneaz valoarea curent a acesteia. Tot ca element ajuttor s-a definit tabelul Judete. Acesta are dou cmpuri i va fi folosit pentru popularea cu date a unui control JComboBox care va servi la alegerea judeului. n tabelul Cititori va fi introdus valoarea numeric ID_JUD aferent judeului selectat.

Ca i n cazul primului formular realizat, se va aduga clasei principale un obiect din clasa JDialog cruia i vor fi apoi adugate controalele necesare, ca n figur.

cit_nume, cit_prenume cit_cnp cit_jud cit_loc cit_adr

cit_tel, cit_email

cit_adauga, cit_imprima, cit_gata

Numele ferestrei de dialog este cititori iar n stnga imaginii noii ferestre sunt scrise numele obiectelor pe care le conine. Pentru a putea imprima coninutul formularului cititori, partea util a acestuia (zona de deasupra butoanelor de comand) a fost dispus pe un control de tip JPanel (denumit cit_imprim).

119
Pentru afiarea formularului se va aduga nc o opiune meniului derulant Formulare , metoda de tratare a evenimentului declanat la selectarea acestuia fiind asemntoare cu cea scris pentru primul formular:

Tot ca n cazul primului formular metoda declanat de selectarea butonului Gata (obiectul cit_gata) realizeaz ascunderea ferestrei.

Pentru a pregti formularul n vederea culegerii de date trebuie populat lista controlului cit_jud. Pentru aceasta vor fi adugate clasei principale dou noi obiecte, cit_cmd de tip Statement i cit_rs de tip ResultSet. Cele dou noi variabile vor fi iniializate n metodele asociate evenimentelor windowActivated i windowDeactivated (CititoriWindowActivated respectiv CititoriWindowDeactivated).

120
n continuare se pot scrie metodele apelate la acionarea butoanelor Adauga i Imprim. Pentru primul buton, secvena de cod care trebuie scris va realiza construirea unei comenzi INSERT folosind valorile din cmpurile formularului. Exemplu:

INSERT into 'Vasile',

Cititori

VALUES

(citi_seq.NEXTVAL,

'0987654321123',

'Pop',

'Drobeta', 12, 'Str. Mica Nr. 14, Bl. B4 Ap. 6', '0258123456','')

Pentru a construi valorile necesare introducerii cheii primare s-a utilizat secvena citi_seq declarat mpreun cu tabelul Cititori. Deoarece n comanda SQL irurile de caractere sunt plasate ntre apostroafe, este convenabil adugarea unei metode care s returneze un ir format prin ncardarea ntre apostroafe a irului primit ca argument. Metoda adugat a fost denumit apostrof() i are urmtoarea definiie:

Metoda cit_adaugaActionPerformed() apelat la apsarea butonului Adauga este urmtoarea:


private void cit_adaugaActionPerformed(java.awt.event.ActionEvent evt) { try { // Preiau valorile din controale String cnp, nume, prenume, localitatea, adresa, telefon, email; int jud; cnp = cit_cnp.getText(); nume = cit_nume.getText(); prenume = cit_prenume.getText(); localitatea = cit_loc.getText(); // Preiau judetul din multimea de selectie int poz = cit_jud.getSelectedIndex(); // Poz. in lista // Caut in cit_rs poz. indicata cit_rs.absolute(poz+1); // mut? cursorul pe a linia poz+1 din cit_rs jud = cit_rs.getInt("ID_JUD"); adresa = cit_adr.getText(); telefon = cit_tel.getText(); email = cit_email.getText(); // Formulez comanda INSERT String frazaSQL = "INSERT into Cititori VALUES (citi_seq.NEXTVAL"; frazaSQL += "," + apostrof(cnp); frazaSQL += "," + apostrof(nume); frazaSQL += "," + apostrof(prenume); frazaSQL += "," + apostrof(localitatea); frazaSQL += "," + jud; frazaSQL += "," + apostrof(adresa);

121
frazaSQL += "," + apostrof(telefon); frazaSQL += "," + apostrof(email)+ ")"; // Creez un Statement Statement stm = cnx.createStatement(); // Apelez metoda executeUpdate() pt. a trimite comanda INSERT //System.out.println(frazaSQL); stm.executeUpdate(frazaSQL); stm.close(); } catch (SQLException ex) { ex.printStackTrace(); } }

Metoda cit_imprimaActionPerformed() apelat la apsarea butonului Imprima realizeaz imprimarea coninutului panoului (JPanel) cit_imprim pe imprimanta implicit :
private void cit_adaugaActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: PrintUtilities.printComponent(cit_imprim); }

Dac se testeaz aplicaia, un rezultat posibil ar fi :

Preluarea datei calendaristice


Tabelul IMPRUMUT al utilizatorului BIBLIO conine dou cmpuri de tip DATE.

122
Pentru inserarea unei nregistrri n acest tabel s-a realizat formularul Imprumuturi.

nume_cititor

titlu_carte

data_imp data_rest

Dup crearea interfeei i impunerea numelor variabilelor ca n figur, s-a scris metoda aferent evenimentului windowActivated. Aceasta va popula cu date cele dou controale cu list, nume_cititor i titlu_carte. naintea nceperii programrii s-au adugat clasei principale variabilele impstat i impstatc din clasa Statement respectiv imprs i imprsc din clasa ResultSet.
private void ImprumuturiWindowActivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { // Populez cele doua liste. Pentru ambele, multimile de selectie // trebuie sa ramana active pana la terminare. // Populez prima lista impstat = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); imprs = impstat.executeQuery("SELECT * from Cititori order by Nume"); nume_cititor.removeAllItems(); while (imprs.next()) { String n = imprs.getString("nume")+" "+imprs.getString("prenume"); nume_cititor.addItem(n); } // Populez a doua lista impstatc = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); imprsc = impstatc.executeQuery("SELECT * from Carti order by Titlu"); titlu_carte.removeAllItems(); while (imprsc.next()) { String n = imprsc.getString("Titlu"); titlu_carte.addItem(n); } } catch (SQLException ex) { ex.printStackTrace(); } }

123

Dup selectarea unei cri va fi nregistrat data mprumutului n caseta de text data_imp. Secvena de cod corespunztoare va constitui corpul metodei asociat evenimentului actionPerformed declanat de selectarea unei cri folosind controlul titlu_carte (JComboBox). Caseta de text data_imp este iniializat cu data calendaristic furnizat de sistemul de operare. Pentru aceasta s-a creat variabila local azi din clasa Calendar apelnd metoda static getInstance(). n continuare s-a definit variabila fmt din clasa SimpleDateFormat destinat impunerii formatului dorit de afiare a datei calendaristice. irul de caractere care va conine data calendaristic n formatul impus se obine prin apelul fmt.format(azi.getTime())). El va fi memorat n caseta de text data_imp. Metoda se ncheie prin transferul controlului intrrilor spre data_rest (metoda requestFocus()).
private void titlu_carteActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Calendar azi = Calendar.getInstance(); SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy"); data_imp.setText(fmt.format(azi.getTime())); data_rest.requestFocus(); }

Crearea unei noi nregistrri n tabelul IMPRUMUT se realizeaz printr-o comand INSERT creat n metoda asociat evenimentului actionPerformed declanat de apsarea butonului "Inregistrare". Corpul acesteia este prezentat n continuare, singura remarc fiind aceea c numrarea elementelor unei mulimi de selecie ncepe de la 1 iar poziia primului element din lista unei casete combinate este 0. De aceea trecerea ntr-o mulime de selecie la o linie corespunznd unei poziii poz din lista asociat unui control JComboBox se va realiza apelnd multime.absolute(poz+1).
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: try { // Inserez o linie in tabelul IMPRUMUT // Preiau codul cititorului int poz = nume_cititor.getSelectedIndex(); imprs.absolute(poz + 1); // Merg pe linia selectata int codcit = imprs.getInt("cod_cit"); // Preiau codul cartii poz = titlu_carte.getSelectedIndex(); imprsc.absolute(poz + 1); // Merg pe linia selectata int codcarte = imprsc.getInt("cod_carte"); // Creez fraza INSERT String frazaSQL = "INSERT into Imprumut VALUES ("; frazaSQL += String.valueOf(codcarte) + "," + String.valueOf(codcit); frazaSQL += "," + apostrof(data_imp.getText()); frazaSQL += "," + apostrof(data_rest.getText()); frazaSQL += "," + 0 +")"; // 0 = FALSE, 1 = TRUE // Creez un Statement Statement stm = cnx.createStatement();

124
// Apelez metoda executeUpdate() pt. a trimite comanda INSERT System.out.println(frazaSQL); stm.executeUpdate(frazaSQL); stm.close(); } catch (SQLException ex) { ex.printStackTrace(); } }

JTable Obiectele din clasa JTable sunt controale Windows destinate afirii datelor sub form tabelar. Deoarece comanda SQL SELECT destinat interogrii serverului de baze de date furnizeaz datele n form tabelar, este evident c interfaa grafic a aplicaiei va conine astfel de controale. Controlul de tip JTable este ns unul deosebit de complex. Pentru pstrarea claselor i a interfeelor necesare construirii i utilizrii acestor controale, n Swing exist un un pachet special, javax.swing.table. Ca i n cazul celorlalte controale Windows, JTable are la baz arhitectura MVC (Model - View - Controller). View este componenta destinat afirii datelor i este integral implementat n clasa JTable, deci nu necesit atenie. Model este practic un obiect care va conine datele de reprezentat. El va aparine unei clase a aplicaiei derivat din clasa AbstractTableModel. Constructorul acestei clase realizeaz memorarea ntr-un tablou bidimensional a datelor care vor fi coninute n tabel. Controller este ansamblul de metode implementate pentru manipularea datelor coninute n tabel i tratarea evenimentelor utilizator. Metodele aparin interfeei

TableModel pe care clasa AbstractTableModel o implementeaz.

Exemplu fundamental: Pentru evidenierea crilor provenind de la diferite edituri se dorete realizarea unui formular care s permit navigarea n tabelul Edituri i afiarea ntr-un tabel a nregistrrilor din tabelul Carti asociate nregistrrii curente din tabelul Edituri. Rezolvare. Datele din tabel pot fi obinute prin executarea interogrii
SELECT titlu, an_apar from Carti where cod_edit = coded

Parametrul coded este de tip int i va avea valoarea cheii primare din tabelul Edituri, cod_edit. Practic la trecerea n mulimea de selecie care conine datele din

125
tabelul edituri de pe o linie pe alta, coded va prelua din linia curent a mulimii de selecie valoarea cmpului cod_edit. Pentru a-i asocia tabelului un obiect care s conin datele, model, se va aduga aplicaiei o nou clas, denumit TbModel derivat din AbstractTableModel.

Deoarece dup adugarea cuvintelor extends AbstractTableModel necesare indicrii derivrii declaraia clasei apare ca eronat, se selecteaz ca n cazurile deja ntlnite Fix Imports. De data aceasta evidenierea declaraiei clasei ca eronat nu dispare. Aceasta deoarece clasa AbstractTableModel conine cteva metode abstracte pe care orice clas derivat trebuie n mod obligatoriu s le implementeze. Pentru evidenierea acestora mediul NetBeans ofer urmtoarea cale: Se selecteaz n meniul aplicaiei Source / Override and Implements Methods (sau se apas Ctrl + I) pentru a se afia fereastra Override and Implement Methods.

126
n fereastra Override and Implement Methods se selecteaz caseta Show Abstract methods Only i se selectez cu Ctrl apsat toate metodele afiate :

Se selecteaz Ok Acestea vor

NetBeans adaug clasei TbModel cele trei metode selectate. trebui ulterior editate.

n continuare este dat fiierul TbModel.java coninnd clasa realizat.


package biblioteca; import java.sql.ResultSet; import java.util.ArrayList; import javax.swing.table.AbstractTableModel; public class TbModel extends AbstractTableModel { private String[] colNume={"Titlu","Anul aparitiei"}; private ArrayList dateContinute; // va fi ArrayList de ArrayList public TbModel(ResultSet rs) { dateContinute = new ArrayList(); try{ while(rs.next()){ ArrayList linie = new ArrayList(); String titlu = rs.getString("TITLU"); int an_apar = rs.getInt("AN_APAR"); linie.add(titlu); linie.add(an_apar); dateContinute.add(linie); } } catch(Exception e){ System.out.println("Exceptie in TbModel"); } }

127

public int getColumnCount() { return colNume.length; } public Object getValueAt(int linie, int col) { // Preiau linia rowIndex ArrayList rand_cautat = (ArrayList) dateContinute.get(linie); return rand_cautat.get(col); } public String getColumnName(int column) { return colNume[column]; } public int getRowCount() { return dateContinute.size(); } }

Dup realizarea acestor completri se poate ncepe construirea formularului EditCarti. Dispunerea i denumirile controalelor acestuia sunt cele din figura urmtoare.

ec_nume

EditCarti ec_gata

ec_prec ec_urm

ec_tabel

Celorlalte controale (JLabel i JScrollPane) nu li s-au schimbat numele. Dup adugarea controlului ec_tabel din clasa JTable se realizeaz adaptrile necesare pentru a-i asocia obiectul care va deine datele (model), aparinnd clasei TbModel definit anterior. Se selecteaz controlul ec_tabel (JTable) i se apas butonul din dreptul proprietii model:

128

n fereastra care se afieaz se impun urmtoarele: numrul de linii care se va afia, numrul de coloane, titlul fiecrei coloane i tipul de dat afiat n fiecare coloan.

129
Pentru afiarea formularului realizat se va aduga meniului derulant Formulare o intrare suplimentar, metoda asociat selectrii acesteia realiznd afiarea ferestrei EditCarti.

Aplicaia mai trebuie completat cu cteva metode asociate unor evenimente: activarea sau dezactivarea ferestrei EditCarti sau acionarea butoanelor din fereastr. Deoarece repopularea tabelului ca urmare a reconstruirii mulimii de selecie corespunztoare unei valori a cheii primare din tabelul Edituri, cod_edit se realizeaz repetat, n trei metode ale clasei (la afiarea formularului i la apsarea butoanelor Precedenta i Urmatoarea), este bine s se programeze o metod ajuttoare. Metoda realizat a fost denumit populareTablou() i coninutul ei este prezentat n continuare.
public void populareTablou(int coded) { Statement carti_stmt = null; ResultSet rs = null; try { carti_stmt = cnx.createStatement(); rs = carti_stmt.executeQuery ( "SELECT titlu, an_apar FROM Carti WHERE cod_edit = " + String.valueOf(coded)); ec_tabel.setModel(new TbModel(rs)); carti_stmt.close(); // Redimensionez prima coloana TableColumn column = null; column = ec_tabel.getColumnModel().getColumn(0); column.setPreferredWidth(300); } catch (SQLException ex) { ex.printStackTrace(); } }

Dup impunerea coninutului tabelului prin apelul metodei setModel() se realizeaz redimensionarea primei coloane a tabelului. Aceast operaie este necesar deoarece n mod normal coloanele sunt create de limi egale. Fiecare coloan dintr-un JTable are asociat un obiect din clasa TableColumn. Clasa TableColumn conine metode pentru preluarea sau impunerea limii unei coloane. n exemplul dat obinerea obiectului TableColumn asociat primei coloane ("Titlu") se realizeaz scriind ec_tabel.getColumnModel().getColumn(0). Limea acesteia este ulterior modificat prin apelul metodei setPreferredWidth(). Secvena de program care trebuie s se execute la activarea ferestrei realizeaz crearea mulimii de selecie necesar navigrii n tabelul Edituri i, dup preluarea codului primei edituri, apeleaz metoda populareTablou(). Obiectul

130
comanda din clasa Statement, va rmne deschis pe toat durata afirii formularului EditCarti.
private void EditCartiWindowActivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { comanda = cnx.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rezultat = comanda.executeQuery("SELECT * FROM edituri order by nume"); // carti_stmt = cnx.createStatement(); if (rezultat.next()) // Trec pe prima linie { String nm = rezultat.getString("nume"); ec_nume.setText(nm); int coded = rezultat.getInt("cod_edit"); populareTablou(coded); } } catch ( SQLException sqlException ) { System.out.println("Conectare imposibila."); System.exit( 1 ); } }

La nchiderea formularului va fi nchis obiectul Statement comanda .

Metodele asociate butoanelor "Precedenta" respectiv "Urmatoarea" realizeaz deplasarea n mulimea de selecie coninnd nregistrrile din tabelul Edituri. La trecerea pe o nou linie a mulimii de selecie se preia numele editurii i se reconstruiete tabelul cu cri prin apelul metodei setModel().
private void ec_urmActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: try { if(!rezultat.isLast()) // nu este pe ultima linie { ec_prec.setEnabled(true); if (rezultat.next()) // Trec pe urmatoarea linie { // preiau numele String nm = rezultat.getString("nume"); ec_nume.setText(nm); int coded = rezultat.getInt("cod_edit"); populareTablou(coded);

131
} } else { ec_urm.setEnabled(false); } } catch (SQLException esq) {} } private void ec_precActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: try { if(!rezultat.isFirst()) // nu este pe prima linie { ec_urm.setEnabled(true); if (rezultat.previous()) // Trec pe linia anterioara { // preiau numele String nm = rezultat.getString("nume"); ec_nume.setText(nm); int coded = rezultat.getInt("cod_edit"); populareTablou(coded); } } else { ec_prec.setEnabled(false); } } catch (SQLException esq) {} }

Butonul Iesire realizeaz ascunderes ferestrei EditCarti:


private void ec_gataActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: EditCarti.setVisible(false); }

Rezultat posibil:

132

Observaie
Foemularul realizat ofer o soluie pentru afiarea informaiilor din dou tabele aflate n relaie 1 la n. De obicei ns selectarea n primul tabel se realizeaz folosind o caset combinat (JComboBox). Selectarea unei valori n caseta combinat provoac repopularea controlului din clasa JTable n care sunt afiate datele din al doilea tabel. Exemplul precedent poate fi uor modificat asfel nct editura s fie selectat ntr-un control JComboBox. O variant posibil este fereastra de dialog CitEdCombo prezentat n continuare.

cited_Editura

cited_Carti CitEdCombo
Dup adugarea controalelor i schimbarea numelor acestora ca n figur, proprietile controlului de tip JTable sunt modificate ca n exemplul precedent (numrul de coloane, titlurite) i apoi sunt generate i editate patru metode 1. WindowActivated:

private void CitEdComboWindowActivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { cited_comanda = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); cited_rs = cited_comanda.executeQuery("SELECT * from Edituri order by Nume"); cited_Editura.removeAllItems(); while (cited_rs.next()) { String n = cited_rs.getString("nume"); cited_Editura.addItem(n); } // Preiau codul primei edituri din lista cited_rs.first(); int coded = cited_rs.getInt("Cod_Edit");

133
// Populez tabelul populareTablou1(coded); } catch (SQLException ex) { ex.printStackTrace(); } }

Variabilele folosite la popularea cu date a controlului de tip JComboBox , cited_comanda (Statement) i cited_rs (ResultSet) au fost n prealabil adugate variabilelor clasei principale. Metoda populareTablou1() este similar metodei populareTablou(). Diferena const n numele controlului din clasa JTable referit.

2. WindowDeactivated La nchiderea formularului trebuie apelate metodele close aferente obiectelor de tip Statement i ResultSet folosite.
private void CitEdComboWindowDeactivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { cited_comanda.close(); } catch (SQLException ex) { ex.printStackTrace(); } }

3. ActionPerformed (declanat de JComboBox) Selectarea unei edituri n caseta combinat declaneaz un eveniment ActionPerformed. Metoda aferent trebuie generat i editat astfel:

private void cited_EdituraActionPerformed(java.awt.event.ActionEvent evt) { try { // TODO add your handling code here: // Se selecteaza codul noii edituri int linie = cited_Editura.getSelectedIndex(); cited_rs.absolute(linie+1); // mut cursorul in cited_rs pe linie int coded = cited_rs.getInt("Cod_Edit"); // Repopulez tabelul populareTablou1(coded); } catch (SQLException ex) { ex.printStackTrace(); } }

134
4. ActionPerformed (declanat de butonul Iesire) Apsarea CitEdCombo. butonului Iesire provoac ascunderea ferestrei de dialog

Inserarea in JTable a altor tipuri de obiecte


Celulele de pe o coloan a unui tabel pot conine n principiu orice tip de obiect, mai frecvent folosite fiind pictogramele i controale de tip JComboBox. Crearea unui tabel coninnd astfel de obiecte necesit ns adugarea de noi clase i secvene de cod care asigur afiarea corect i tratarea evenimentelor specifice. Exemplu: Se consider un formular care afieaz cititorii unei biblioteci:

Pentru a da posibilitate operatorului s iniieze corectarea datelor unui cititor prin simpla selectare cu mouse-ul a pictogramei din prima coloan corespunznd liniei eronate se va proceda astfel:

135

1. Se adaug aplicaiei o clas nou care va prelua afiarea noului tip de dat:
package biblioteca; public class Afisez { /** Creates a new instance of Afisez */ public Afisez() { } }

Se corecteaz declaraia DefaultTableCellRenderer. ...

clasei

astfel

nct

fie

derivat

din

public class Afisez extends DefaultTableCellRenderer { Se elimin eroarea evideniat de editor prin completarea listei de pachete incluse folosind opiunea Fix imports a mediului de programare. Se suprascrie metoda getTableCellRendererComponent() motenit de la clasa de baz. Pentru aceasta se selecteaz n meniul derulant Source opiunea Override Methods:

Metoda adugat este apoi editat. Corpul acesteia va conine crearea unui obiect din clasa ImageIcon. Acesta va fi impus ca i coninut al celulei din tabel prin apelul metodei setIcon().
public Component getTableCellRendererComponent(JTable table,

136
Object value, boolean isSelected, boolean hasFocus, int row, int column) { ImageIcon icon=new ImageIcon( getClass().getResource("img/edit_big.gif")); setIcon(icon); return this; }

2. Ca i n exemplele precedente se adaug aplicaiei o clas nou (denumit TbModelCiti) care va servi la pstrarea datelor tabelului. Coninutul acesteia este similar celor deja realizate.
package biblioteca; import java.sql.ResultSet; import java.util.ArrayList; import javax.swing.table.AbstractTableModel; public class TbModelCiti extends AbstractTableModel { private String[] colNume={"Edit","Nume", "Prenume", "CNP"}; private ArrayList dateContinute; // va fi ArrayList de ArrayList /** Creates a new instance of TbModelCiti */ public TbModelCiti(ResultSet rs) { dateContinute = new ArrayList(); try{ while(rs.next()){ ArrayList linie = new ArrayList(); String nume = rs.getString("NUME"); String prenume = rs.getString("PRENUME"); String cnp = rs.getString("CNP"); linie.add(null); // aici va fi pictograma linie.add(nume); linie.add(prenume); linie.add(cnp); dateContinute.add(linie); } } catch(Exception e){ System.out.println("Exceptie in TbModel"); } } public Object getValueAt(int linie, int col) { // Preiau linia rowIndex ArrayList rand_cautat = (ArrayList) dateContinute.get(linie); return rand_cautat.get(col); } public int getRowCount() { return colNume.length; } public int getColumnCount() { return dateContinute.size(); } public String getColumnName(int column) {

137
return colNume[column]; } }

3. naintea crerii tabelului pentru afiarea cititorilor se vor aduga clasei principale perechea de variabile comanda_citi (Statement) i rs_citi (ResultSet) precum i metoda getCiti() care construiete un obiect din clasa ResultSet coninnd cititorii din baza de date.
public ResultSet getCiti() { rs_citi=null; try { comanda_citi = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs_citi=comanda_citi.executeQuery("Select * from Cititori"); } catch (SQLException ex) { ex.printStackTrace(); } return rs_citi; }

4. Crearea tabelului coninnd cititorii se va face prin inserarea lui folosind mediul de dezvoltare. Dup inserare se va accesa proprietatea model:

n fereastra de definire a modelului se va selecta pentru Select Mode: valoarea Form Connection:

Apoi se va apsa butonul Advanced i vor fi impuse secvenele de cod care vor fi executate naintea respectiv dup crearea tabelului tabelCiti:

138

Secvena Post-initialization impune clasa Afiez realizat anterior ca delegat pentru afiarea primei coloane a tabelului. Dup selectarea butonului Ok se revine n fereastra de editare a modelului, se selecteaz butonul User Code i se adaug apelul constructorului clasei TbModelCiti.

Cele 3 secvene de cod incluse n fereastra de configurare a modelului pot fi identificate n corpul metodei initComponents(), generat automat de ctre mediul de dezvoltare.

...

139
De altfel aceast procedur poate fi urmat n toate cazurile n care se dorete impunerea unui anumit mod de creare a unei componente a interfeei. Pentru a realiza afiarea unei ferestre de editare la selectarea cu mouse-ul a unei pictograme din prima coloan a tabelului, n metoda executat la activarea ferestrei se va creea un obiect aparinnd unei clase anonime care va implementa interfaa ListSelectionListener, ca mai jos.
private void AfisareCititoriWindowActivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: tabelCiti.setRowHeight(32); tabelCiti.clearSelection(); TableColumn column = null; column = tabelCiti.getColumnModel().getColumn(0); column.setPreferredWidth(0); column = tabelCiti.getColumnModel().getColumn(1); column.setPreferredWidth(130); tabelCiti.setCellSelectionEnabled(false); column = tabelCiti.getColumnModel().getColumn(2); column.setPreferredWidth(130); ListSelectionModel rowSM = tabelCiti.getSelectionModel(); rowSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { //Ignore extra messages. if (e.getValueIsAdjusting()) return; ListSelectionModel lsm = (ListSelectionModel)e.getSource(); if (!lsm.isSelectionEmpty()) { int selectedRow = lsm.getMinSelectionIndex(); //selectedRow is selected int coloana = tabelCiti.getColumnModel().getSelectionModel().getAnchorSelectionIndex(); if(coloana == 0) { String s = "Celula " + selectedRow + ", " + coloana + " e selectata."; JOptionPane.showMessageDialog(null,s); // Se inlocuieste } tabelCiti.clearSelection(); } } }); Calendar azi = Calendar.getInstance(); SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy"); dataRaport.setText(fmt.format(azi.getTime())); }

Apelul JOptionPane.showMessageDialog(null,s); va fi nlocuit cu apelul metodei SetVisible(true) pentru fereastra de dialog care trebuie afiat (fereastra de editare a cititorului).

140

Laborator nr. 9 Interfaa aplicaiei. Controale Windows. Adugarea datelor n baza de date.
1. Pornii aplicaia NetBeans. 2. Creai un formular pentru adugarea autorilor n baza de date

Obs. adugai meniului aplicaiei biblio o nou intrare n meniul Formulare, Adugare de tip JMenu, cu o opiune, Autori (JMenuItem). ataai opiunii din meniu adugate o funcie de tratare (actionPerformed) coninnd secvena de cod: AAutori.setLocation(120,170); AAutori.setVisible(true); AAutori.pack(); creai n Oracle un obiect de tip sequence (secven) necesar introducerii codului autorului. Numele noului obiect va fi autoaut. Pentru aceasta selectai n interfaa grafic a serverului Oracle XE Object Browser / Create / Sequence i dai secvenei numele autoaut, cu valoarea de pornire 1 i valoarea incrementului 1. Creai un formular pentru adugarea cititorilor n baza de date, astfel: selectai succesiv fereastra principal i controlul JDialog din fereastra Palette; selectai cu dublu clic intrarea n arborele din fereastra Inspector identificatorul noii ferestre; adugai cele trei controale de tip JLabel (pentru titlu i etichetele formularului), dou controale de tip JTextField i cele dou controale de tip JButton; schimbai textele corespunztoare acestor controale;

141 schimbai numele controalelor (clic dreapta pe control n fereastra Inspector -> Change Variable Name) astfel:

Obs. Deoarece n comanda SQL insert care va fi construit n cadrul funciei apelate la acionarea butonului Introducere irurile de caractere sunt plasate ntre apostroafe, este convenabil adugarea n cadrul clasei principale a unei metode care s returneze un ir format prin ncardarea ntre apostroafe a irului primit ca argument. Metoda adugat a fost denumit apostrof() i are urmtoarea definiie: public String apostrof(String p) { String c = "'" + p + "'"; return c; }

codul necesar prelurii coninuturilor din controale i apoi scrierii n baza de date este : try { String nume, prenume; nume = numaut.getText(); prenume = prenumaut.getText(); String frazaSQL = "INSERT into autori VALUES (autoaut.NEXTVAL"; frazaSQL += "," + apostrof(nume); frazaSQL += "," + apostrof(prenume)+ ")"; // Creez un Statement*/ Statement stm = cnx.createStatement(); // Apelez metoda executeUpdate() pt. a trimite comanda INSERT stm.executeUpdate(frazaSQL); stm.close();

142 } catch (SQLException ex) { ex.printStackTrace(); } numaut.setText(""); prenumaut.setText(""); } adugai codul necesar nchiderii formularului AAutori AAutori.setVisible(false);

3. Adugai proiectului biblio o alt intrare n submeniul Formulare/ Adugare Cititori.


(JMenuItem).

4. Adugai intrrii acititori ( = adugare cititori) evenimentului actionPerformed codul: ACititori.setLocation(120,170); ACititori.setVisible(true); ACititori.pack(); 5. Creai n baza de date biblio, un nou tabel, judet, cu 3 cmpuri, cod_jud (number(2,0)), jude (varchar2(50)) i acronim (char(2) i introducei cteva judee. 6. Modificai n baza de date tabelul cititori , nlocuind cmpul judetul cu noul cmp, cod_jud, cheie strin. 7. Modificai deopotriv felul cmpului cod_cit, transformndu-l n cmp de tip autoincrement. Pentru asta declarai un obiect de tip secven (Object Browser / Create / Sequence) cu numele de autocit, cu valoarea de pornire 1 i valoarea incrementului 1: 8. Creai un formular pentru adugarea cititorilor n baza de date, astfel: selectai succesiv fereastra principal i controlul JDialog din fereastra Palette;

143 selectai cu dublu clic intrarea n arborele din fereastra Inspector identificatorul noii ferestre; adugai cele nou controale de tip JLabel (pentru titlu i etichetele formularului), ase controale de tip JTextField, un control de tip JTextArea , un control de tip JComboBox i cele dou controale de tip JButton; schimbai textele corespunztoare acestor controale; schimbai numele controalelor (clic dreapta pe control n fereastra Inspector -> Change Variable Name) astfel:

adugai clasei principale dou noi obiecte, unul adcitrez, din clasa Statement ( iniializat la deschiderea formularului i nchis la ieirea din acesta), i un al doilea, interogare1, din clasa ResultSet (acesta va conine comenzi SQL individuale care vor fi apoi trimise serverului Oracle XE ) respectnd ordinea: Biblio -> Source Packages -> Biblioteca -> Biblio.java ->Biblio -> Fields -> Add Field;

ataai evenimentului windowActivated ( n fereastra Inspector : Form Biblio -> Other Components -> ACititori) metoda AutoriWindowActivated care va conine: iniializarea celor dou obiecte (adcitrez i interogare1);

144 popularea cu date a listei controlului jud de tip combobox; try { adcitrez = cnx.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); interogare1 = adcitrez.executeQuery("SELECT * FROM judet order by judet"); jud.removeAllItems(); while (interogare1.next()) { String nm = interogare1.getString("judet"); jud.addItem(nm); } } catch ( SQLException ex ) { ex.printStackTrace(); System.exit( 1 ); } ataai evenimentului windowDeactivated metoda ACititoriWindowDeactivated try { adcitrez.close(); interogare1.close(); } catch (SQLException ex) { ex.printStackTrace(); }

codul necesar prelurii coninuturilor din controale i apoi scrierii n baza de date este : try { String cenepe, nume, prenume, localitatea, adresa, telefon, mail; int jude; cenepe = cnp.getText(); nume = num.getText(); prenume = pren.getText(); localitatea = loc.getText(); int poz = jud.getSelectedIndex(); // Poz. in lista interogare1.absolute(poz+1); // mut cursorul pe linia poz+1 jude = interogare1.getInt("cod_jud"); adresa = adr.getText(); telefon = tel.getText(); mail = email.getText(); String frazaSQL = "INSERT into cititori VALUES (autocit.NEXTVAL"; frazaSQL += "," + apostrof(cenepe); frazaSQL += "," + apostrof(nume); frazaSQL += "," + apostrof(prenume); frazaSQL += "," + apostrof(localitatea);

145 frazaSQL += "," + jude; frazaSQL += "," + apostrof(adresa); frazaSQL += "," + apostrof(telefon); frazaSQL += "," + apostrof(mail)+ ")"; // Creez un Statement*/ Statement stm = cnx.createStatement(); // Apelez metoda executeUpdate() pt. a trimite comanda INSERT System.out.println(frazaSQL); stm.executeUpdate(frazaSQL); stm.close(); } catch (SQLException ex) { ex.printStackTrace(); } }

adugai codul necesar nchiderii formularului ACititori ACititori.setVisible(false);

9. Creai un formular pentru adugarea editurilor n baza de date

146

Laborator nr. 10 Interfaa aplicaiei. Controale Windows. JTable.


10. Pornii aplicaia NetBeans. 11. Adugai proiectului biblio o alt intrare n meniul Formulare, Situatii de tip JMenu, cu o intrare de tip JMenuItem, Cartile unui autor.

12. Adugai pentru intrarea cartiaut ( = cartile unui autor) metoda de tratare a evenimentului actionPerformed care va conine codul: CartiAut.setLocation(120,170); CartiAut.setVisible(true); CartiAut.pack(); 13. Creai un formular pentru vizualizarea crilor unui autor, astfel:

pentru funcionarea corect a formularului trebuie s procedai astfel : adugai aplicaiei o nou clas, TbModel derivat din AbstractTableModel

147 Dup adugarea noii clase corectai-i declaraia astfel nct s reias derivarea dorit: public class TbModel extends AbstractTableModel {

adugai clasei TbModel dou variabile: private String[] colNume={"Cartea","Anul aparitiei"}; private ArrayList dateContinute; // va fi ArrayList de ArrayList

adugai clasei TbModel trei metode - getColumnCount(), getRowCount() i getValueAt(int,int) - alegnd Source -> Override Methods -> Show abstract Methods Only. Odat cu adugarea clasei TbModel s-a creat fiierul TbModel.java. Aici editai codul celor trei metode astfel: public int getColumnCount() { return colNume.length; }

public int getRowCount() { return dateContinute.size(); }

public Object getValueAt(int linie, int col) { // Preiau linia rowIndex ArrayList rand_cautat = (ArrayList) dateContinute.get(linie); return rand_cautat.get(col); }

Adugai noii clase metoda getColumnName() : public String getColumnName(int column) { return colNume[column]; }

Editai constructorul clasei TbModel astfel nct s adauge n variabila dateContinute din clasa ArrayList datele primite n momentul apelrii constructorului coninute ntr-un obiect din clasa ResultSet. public class TbModel extends AbstractTableModel{ private String[] colNume={"Cartea","Anul aparitiei"}; private ArrayList dateContinute; // va fi ArrayList de ArrayList

148

/** Creates a new instance of TbModel */ public TbModel(ResultSet rs) { dateContinute = new ArrayList(); try{ while(rs.next()){ ArrayList linie = new ArrayList(); String cartea = rs.getString("titlu"); int an_apar = rs.getInt("an_apar"); linie.add(cartea); linie.add(an_apar); dateContinute.add(linie); } } catch(Exception e){ System.out.println("Exceptie in TbModel"); } } revenii la clasa principal i adugai-i dou variabile globale , una de tip Statement i una de tip ResultSet: Statement aut_comanda ; ResultSet aut_rs ; la deschiderea formularului trebuie rulat o secven de cod care populeaz controalele aut (JComboBox) i autcarti (JTable): private void CartiAutWindowActivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { aut_comanda = cnx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); aut_rs = aut_comanda.executeQuery("SELECT * from autori order by nume"); aut.removeAllItems(); while (aut_rs.next()) { String n = aut_rs.getString("nume"); aut.addItem(n); } // Preiau codul primului autor din lista aut_rs.first(); int codaut = aut_rs.getInt("cod_aut"); // Populez tabelul din grid Statement carti_stmt = null; ResultSet rs = null; try {

149

carti_stmt = cnx.createStatement(); rs = carti_stmt.executeQuery ("SELECT carti.titlu, carti.an_apar FROM carti, autori, autcarti WHERE autori.cod_aut = autcarti.cod_aut and carti.cod_carte = autcarti.cod_carte and autori.cod_aut = " + String.valueOf(codaut)); autcarti.setModel(new TbModel(rs)); carti_stmt.close(); // Redimensionez prima coloana TableColumn column = null; column = autcarti.getColumnModel().getColumn(0); column.setPreferredWidth(300); } catch (SQLException ex) { ex.printStackTrace(); } } catch (SQLException ex) { ex.printStackTrace(); } }

la nchiderea formularului trebuie apelat metoda close pentru obiectul de tip Statement folosit: private void CartiAutWindowDeactivated(java.awt.event.WindowEvent evt) { // TODO add your handling code here: try { aut_comanda.close(); } catch (SQLException ex) { ex.printStackTrace(); } }

Ataai o metod de tratare a evenimentului produs la selectarea unui nou autor n controlul aut (JComboBox) . n aceast metod se va prelua codul autorului selectat de utilizator i se va repopula controlul autcarti (JTable). private void autActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: try { // Se selecteaza codul autorului int linie = aut.getSelectedIndex();

150 if (linie>=0){ aut_rs.absolute(linie+1); int codaut = aut_rs.getInt("Cod_aut"); // Repopulez tabelul Statement carti_stmt = null; ResultSet rs = null; try { carti_stmt = cnx.createStatement(); rs = carti_stmt.executeQuery ("SELECT carti.titlu, carti.an_apar FROM carti, autori, autcarti WHERE autori.cod_aut = autcarti.cod_aut and carti.cod_carte = autcarti.cod_carte and autori.cod_aut = " + String.valueOf(codaut)); // Repopulare JTable autcarti.setModel(new TbModel(rs)); carti_stmt.close(); // Redimensionez prima coloana TableColumn column = null; column = autcarti.getColumnModel().getColumn(0); column.setPreferredWidth(300); } catch (SQLException ex) { ex.printStackTrace(); } } } catch (SQLException ex) { ex.printStackTrace(); } } Metoda executat la apsarea butonului "Iesire" private void ies3ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: CartiAut.setVisible(false); } 14. Respectnd aceeai procedur ca i la formularul anterior, creai un formular pentru vizualizarea crilor aprute la o editur, astfel:

151

Observaii: fraza SELECT pentru popularea controlului de tip JComboBox va fi: SELECT * from edituri order by nume fraza SELECT pentru popularea controlului de tip JTable va fi:

SELECT carti.titlu, autori.nume, carti.an_apar FROM carti, autori, autcarti, edituri WHERE autori.cod_aut = autcarti.cod_aut and carti.cod_carte = autcarti.cod_carte and carti.cod_edit = edituri.cod_edit and edituri.cod_edit = String.valueOf(codedit) dac fraza SELECT este prea lung, putei adopta urmtorul mod de scriere: String fraza; fraza = "SELECT carti.titlu, autori.nume, carti.an_apar "; fraza += "FROM carti, autori, autcarti, edituri "; fraza += "WHERE autori.cod_aut = autcarti.cod_aut and "; fraza += "carti.cod_carte = autcarti.cod_carte and "; fraza += "carti.cod_edit = edituri.cod_edit and "; fraza += "edituri.cod_edit = " + String.valueOf(codedit); rs = carti_stmt.executeQuery(fraza);

clasa declarat : public class TbModel_1 extends AbstractTableModel { private String[] colNume={"Titlul cartii","Autorul", "Anul aparitiei"}; private ArrayList dateContinute; // va fi ArrayList de ArrayList public TbModel_1(ResultSet rs) { dateContinute = new ArrayList();

152 try{ while(rs.next()){ ArrayList linie = new ArrayList(); String cartea = rs.getString("titlu"); String autorul = rs.getString("nume"); int an_apar = rs.getInt("an_apar"); linie.add(cartea); linie.add(autorul); linie.add(an_apar); dateContinute.add(linie); } } catch(Exception e){ System.out.println("Exceptie in TbModel_1"); } } cele patru metode ale noii clase vor fi identice cu metodele clasei TbModel de la exemplul anterior declarai dou variabile globale , una de tip Statement i una de tip ResultSet: Statement edi_comanda ; ResultSet edi_rs ;

15. Creai un formular pentru vizualizarea crilor mprumutate de ctre un cititor, astfel:

S-ar putea să vă placă și

  • Or Curs9 10
    Or Curs9 10
    Document41 pagini
    Or Curs9 10
    225701
    Încă nu există evaluări
  • Oracle Curs5 6
    Oracle Curs5 6
    Document35 pagini
    Oracle Curs5 6
    225701
    Încă nu există evaluări
  • Oracle Curs3 4
    Oracle Curs3 4
    Document39 pagini
    Oracle Curs3 4
    225701
    Încă nu există evaluări
  • Or Curs5 6
    Or Curs5 6
    Document37 pagini
    Or Curs5 6
    Andrei
    Încă nu există evaluări
  • Oracle 2
    Oracle 2
    Document21 pagini
    Oracle 2
    225701
    Încă nu există evaluări
  • Oracle 2
    Oracle 2
    Document21 pagini
    Oracle 2
    225701
    Încă nu există evaluări
  • Oracle PDF
    Oracle PDF
    Document23 pagini
    Oracle PDF
    225701
    Încă nu există evaluări