Documente Academic
Documente Profesional
Documente Cultură
Or Curs9 10 PDF
Or Curs9 10 PDF
JPasswordField
JTextArea
JCheckBox
Un control de tip casetă de validare (JCheckBox) poate avea două stări: selectat
sau neselectat. Starea de selectare poate fi stabilită în momentul realizării interfeŃei
grafice sau în timpul execuŃiei aplicaŃiei, prin apelul metodei setChecked(). Testarea stării
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 declanşat la selectarea acestuia cu mouse-
ul.
113
JRadioButton
Controller
View Model
JComboBox
Controlul de tip JComboBox permite selectarea unei valori dintr-o listă predefinită.
Definirea listei se realizează de obicei în etapa de proiectare a aplicaŃiei, conŃinutul
acesteia fiind accesibil prin intermediul proprietăŃii model, Lista poate fi construită şi
editată şi dinamic, în timpul execuŃiei, folosind metodele:
Tip
Metoda AcŃiune
returnat
void addItem(Object obj) Adaugă un element în listă
void insertItemAt(Object obj, int index) Inserează un element în listă
Object getSelectedItem() Returnează ob. selectat
int getSelectedIndex() Returnează poz. elem. selectat
void removeAllItems() Goleşte lista
void removeItem(Object obj) Suprimă prima apariŃie a obj.
void removeItemAt(int index) Suprimă el.. de la poziŃia index
int getItemCount() Returnează nr. de elemente
void setEditable() În funcŃie de argument
caseta de text va fi editabilă
sau needitabilă
Metoda split() a clasei String permite separarea unui şir de caractere într-un
număr de subşiruri, separatorii permişi fiind daŃi într-un şir (al doilea argument). În
exemplul prezentat şirul folosit ca argument conŃine un spaŃiu.
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 iniŃială. Modificarea acestei proprietăŃi se realizează folosind metoda
setEditable().
Tot ca element ajutător s-a definit tabelul Judete. Acesta are două câmpuri şi
va fi folosit pentru popularea cu date a unui control JComboBox care va servi la
alegerea judeŃului. În tabelul Cititori va fi introdusă valoarea numerică ID_JUD
aferentă judeŃului selectat.
cit_nume, cit_prenume
cit_cnp
cit_jud
cit_loc
cit_adr
cit_tel, cit_email
Numele ferestrei de dialog este cititori iar în stânga imaginii noii ferestre sunt
scrise numele obiectelor pe care le conŃine. Pentru a putea imprima conŃinutul
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
nume_cititor titlu_carte
data_imp
data_rest
JTable
Obiectele din clasa JTable sunt controale Windows destinate afişării datelor sub
formă tabelară. Deoarece comanda SQL SELECT destinată interogării serverului de baze
de date furnizează datele în formă tabelară, este evident că interfaŃa grafică a aplicaŃiei va
conŃine astfel de controale. Controlul de tip JTable este însă unul deosebit de complex.
Pentru păstrarea claselor şi a interfeŃelor necesare construirii şi utilizării 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ă afişării datelor şi este integral implementată în
clasa JTable, deci nu necesită atenŃie.
Model este practic un obiect care va conŃine datele de reprezentat. El va aparŃine
unei clase a aplicaŃiei derivată din clasa AbstractTableModel. Constructorul acestei clase
realizează memorarea într-un tablou bidimensional a datelor care vor fi conŃinute în tabel.
Controller este ansamblul de metode implementate pentru manipularea datelor
conŃinute în tabel şi tratarea evenimentelor utilizator. Metodele aparŃin interfeŃei
TableModel pe care clasa AbstractTableModel o implementează.
Exemplu fundamental:
Pentru evidenŃierea cărŃilor provenind de la diferite edituri se doreşte
realizarea unui formular care să permită navigarea în tabelul Edituri şi afişarea într-un
tabel a înregistrărilor din tabelul Carti asociate înregistrării curente din tabelul Edituri.
Rezolvare. Datele din tabel pot fi obŃinute prin executarea interogării
Parametrul coded este de tip int şi va avea valoarea cheii primare din tabelul
Edituri, cod_edit. Practic la trecerea în mulŃimea de selecŃie care conŃine datele din
125
tabelul edituri de pe o linie pe alta, coded va prelua din linia curentă a mulŃimii de
selecŃie valoarea câmpului cod_edit.
Pentru a-i asocia tabelului un obiect care să conŃină datele, model, se va
adăuga aplicaŃiei o nouă clasă, denumită TbModel derivată din AbstractTableModel.
• Se selectează Ok
NetBeans adaugă clasei TbModel cele trei metode selectate. Acestea vor
trebui ulterior editate.
În continuare este dat fişierul TbModel.java conŃinând clasa realizată.
package biblioteca;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
ec_nume EditCarti
ec_gata
ec_prec
ec_urm
ec_tabel
comanda din clasa Statement, va rămâne deschis pe toată durata afişării formularului
EditCarti.
}
} else {
ec_urm.setEnabled(false);
}
} catch (SQLException esq) {}
}
Rezultat posibil:
132
ObservaŃie
Foemularul realizat oferă o soluŃie pentru afişarea informaŃiilor din două
tabele aflate în relaŃie 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 afişate datele din al
doilea tabel. Exemplul precedent poate fi uşor modificat asfel încât editura să fie
selectată într-un control JComboBox. O variantă posibilă este fereastra de dialog
CitEdCombo prezentată în continuare.
cited_Editura
cited_Carti
CitEdCombo
// Populez tabelul
populareTablou1(coded);
} catch (SQLException ex) {
ex.printStackTrace();
}
}
2. WindowDeactivated
La închiderea formularului trebuie apelate metodele close aferente obiectelor
de tip Statement şi ResultSet folosite.
package biblioteca;
public class Afisez {
Metoda adăugată este apoi editată. Corpul acesteia va conŃine crearea unui
obiect din clasa ImageIcon. Acesta va fi impus ca şi conŃinut al celulei din tabel prin
apelul metodei setIcon().
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ă aplicaŃiei o clasă nouă
(denumită TbModelCiti) care va servi la păstrarea datelor tabelului. ConŃinutul
acesteia este similar celor deja realizate.
package biblioteca;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
return colNume[column];
}
}
...
139
tabelCiti.getColumnModel().getSelectionModel().getAnchorSelectionIndex();
if(coloana == 0) {
String s = "Celula " + selectedRow + ", " + coloana + " e selectata.";
JOptionPane.showMessageDialog(null,s); // Se inlocuieste
}
tabelCiti.clearSelection();
}
}
});
Laborator nr. 9
Obs.
• adăugaŃi meniului aplicaŃiei biblio o nouă intrare în meniul Formulare, Adăugare – de tip
JMenu, cu o opŃiune, Autori (JMenuItem).
• ataşaŃi opŃiunii din meniu adâugate o funcŃie de tratare (actionPerformed) conŃinând
secvenŃa de cod:
AAutori.setLocation(120,170);
AAutori.setVisible(true);
AAutori.pack();
• creaŃi în Oracle un obiect de tip sequence (secvenŃă) necesar introducerii codului autorului.
Numele noului obiect va fi autoaut.
Pentru aceasta selectaŃi în interfaŃa grafică a serverului Oracle XE Object Browser / Create /
Sequence şi daŃi secvenŃei numele autoaut, cu valoarea de pornire 1 şi valoarea incrementului
1.
• CreaŃi un formular pentru adăugarea cititorilor în baza de date, astfel:
selectaŃi succesiv fereastra principală şi controlul JDialog din fereastra Palette;
selectaŃi cu dublu clic intrarea în arborele din fereastra Inspector identificatorul noii
ferestre;
adăugaŃi cele trei controale de tip JLabel (pentru titlu şi etichetele formularului), două
controale de tip JTextField şi cele două controale de tip JButton;
schimbaŃi textele corespunzătoare acestor controale;
141
schimbaŃi 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 funcŃiei apelate la acŃionarea
butonului Introducere şirurile de caractere sunt plasate între apostroafe, este convenabilă adăugarea
în cadrul clasei principale a unei metode care să returneze un şir format prin încardarea între
apostroafe a şirului primit ca argument.
• codul necesar preluării conŃinuturilor din controale şi apoi scrierii în baza de date este :
try
{
String nume, prenume;
nume = numaut.getText();
prenume = prenumaut.getText();
}
catch (SQLException ex) {
ex.printStackTrace();
}
numaut.setText("");
prenumaut.setText("");
}
5. CreaŃi în baza de date biblio, un nou tabel, judet, cu 3 câmpuri, cod_jud (number(2,0)), judeŃ
(varchar2(50)) şi acronim (char(2) şi introduceŃi câteva judeŃe.
6. ModificaŃi în baza de date tabelul cititori , înlocuind câmpul judetul cu noul câmp, cod_jud,
cheie străină.
7. ModificaŃi deopotrivă felul câmpului cod_cit, transformându-l în câmp de tip autoincrement.
Pentru asta declaraŃi un obiect de tip secvenŃă (Object Browser / Create / Sequence) cu numele de
autocit, cu valoarea de pornire 1 şi valoarea incrementului 1:
8. CreaŃi un formular pentru adăugarea cititorilor în baza de date, astfel:
• selectaŃi succesiv fereastra principală şi controlul JDialog din fereastra Palette;
143
• selectaŃi cu dublu clic intrarea în arborele din fereastra Inspector identificatorul noii
ferestre;
• adăugaŃi 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;
• schimbaŃi textele corespunzătoare acestor controale;
• schimbaŃi numele controalelor (clic dreapta pe control în fereastra Inspector -> Change
Variable Name) astfel:
• adăugaŃi clasei principale două noi obiecte, unul adcitrez, din clasa Statement ( iniŃializat la
deschiderea formularului şi închis la ieşirea din acesta), şi un al doilea, interogare1, din
clasa ResultSet (acesta va conŃine comenzi SQL individuale care vor fi apoi trimise
serverului Oracle XE ) respectând ordinea: Biblio -> Source Packages -> Biblioteca ->
Biblio.java
->Biblio -> Fields -> Add Field;
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 );
}
• codul necesar preluării conŃinuturilor 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();
adresa = adr.getText();
telefon = tel.getText();
mail = email.getText();
Laborator nr. 10
12. AdăugaŃi pentru intrarea cartiaut ( = cartile unui autor) metoda de tratare a evenimentului
actionPerformed care va conŃine codul:
CartiAut.setLocation(120,170);
CartiAut.setVisible(true);
CartiAut.pack();
13. CreaŃi un formular pentru vizualizarea cărŃilor unui autor, astfel:
După adăugarea noii clase corectaŃi-i declaraŃia astfel încât să reiasă derivarea dorită:
• reveniŃi la clasa principală şi adăugaŃi-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");
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);
• 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();
}
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
}
} catch (SQLException ex) {
ex.printStackTrace();
ObservaŃii:
• fraza SELECT pentru popularea controlului de tip JComboBox va fi:
SELECT * from edituri order by nume
• dacă fraza SELECT este prea lungă, puteŃi adopta următorul mod de scriere:
String fraza;
rs = carti_stmt.executeQuery(fraza);
• clasa declarată :
try{
while(rs.next()){
ArrayList linie = new ArrayList();
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
• declaraŃi două variabile globale , una de tip Statement şi una de tip ResultSet:
Statement edi_comanda ;
ResultSet edi_rs ;
15. CreaŃi un formular pentru vizualizarea cărŃilor împrumutate de către un cititor, astfel: