Kratki vodič za pravljenje klijent server aplikacija korištenjem NetBeans okruženja i MySQL baze podataka
Amel Džanić
U ovome primjeru ćemo obraditi osnovne operacije koje su potrebne da bi se napravila po današnjim standardima klijent server aplikacija. Program će biti pisan u Java programskom jeziku sa korištenjem NetBeans razvojnog okruženja. U ovome primjeru ćemo na najednostavniji način da prikažemo osnovne operacije nad bazom podataka, gdje ćemo kreirati jednu malu bazu koju ćemo nazvati imenik, sa samo jednom tabelom osoba. Pa krenimo na posao. Kreiranje baze Prije nego što počnemo želim da jasno naglasim da ovaj materijal nije za učenje baza podataka, i koncepata baza podataka, a isto tako i programiranja. Podrazumjeva se da mislim da ovo dvoje dobro poznajete, te će vam ovaj materijal pomoći u vašem radu na seminarskim radovima koje ste dobili. Ovo je samo demostrativan primjer na koji način možete napraviti brzo aplikuaciju. Za kreiranje baze podataka koristićemo MySQL Administratora, prikazan na slici 1. Poslije logiranja na MySQL Administratora kreirati ćemo novu šemu (Bazu podataka) koju ćemo nazvati Imenik. Tada ćemo u toj šemi napraviti novu tabeli koju ćemo nazvati osoba, koja će imati sljedeće atribute id,ime,prezime,brTelefona. SQL skripta za ovu tabelu je: CREATE TABLE `imenik`.`Osoba` ( `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, `ime` VARCHAR(45) NOT NULL, `prezime` VARCHAR(45) NOT NULL, `brTelefona` VARCHAR(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB; Prije nego što krenemo dalje kreiraćemo novog korisnika, i to ćete uraditi tako što ćete otći na User Administration te dodati novog korisnika. U našem slučaju to će biti test sa lozinkom 1111. Nakon toga moramo ovom novom korisniku dodati privilegije a to ćemo uraditi na taj način što ćete otići na Scheme privilegies, te tamo naći našu bazu imenik te pridružiti sve privilegije koje su naraspolaganju.
Sada kada sam kreirao tabelu u koju ću smještati svoje podatke, te korisnika preko kojeg ćemo raditi sa bazom, treba da krenem u pisanje koda. Rad u NetBeansu E sad nam dolazi teži, ali po meni najzanimljiviji, dio programskog koda, tj pisanje programske logike koja treba da se poveže sa bazom, te da odradi sve mogućnosti koje budemo željeli. Inače kod pisanja koda postoji jedno pravilo, a to je da se razdvoje klase koje su programska logika, od klasa koje će služiti samo za interfejs prema korisniku (GUI). Ukoliko radite kompleksan software zasigurno ćete imati i više paketa. No, budući da je ovaj zadatak jednostavan razviti ćemo samo dva paketa. Jedan ću nazvati source u koji ćemo smjestiti programsku logiku, a drugi ćemo nazvati gui gdje ćemo smjestiti klase koje su zadužene za interakciju sa korisnikom (GUI). Znači kreirati ćemo novi projekat koji ćemo nazvati Imenik, te ćemo u dijelu Source Packages dodati naša dva gore spomenuta paketa (slika 3)
Slika 3. Izgled Project pogleda Nakon toga idemo da pišemo izvorni kod koji će nam služiti u svim našim klasama za pristupanje bazi podataka. Tu ćemo klasu nazvati MySQLUtil i ona je smještena u paketu source. Te evo njenog izvornog koda: package source; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.text.DateFormat; import java.text.ParseException;
import java.util.Locale; /** * * @author Administrator */ public class MySQLUtil { public static final String BAZA_HOST = "127.0.0.1"; public static final String BAZA_PORT = "3306"; public static final String BAZA_USER = "test"; public static final String BAZA_PASSWORD = "1111"; public static final String BAZA_NAME = "imenik"; public static final String BAZA_KON = "jdbc:mysql://" + BAZA_HOST + ":" + BAZA_PORT + "/" + BAZA_NAME; public Connection con; public Statement stmt; public ResultSet rs; public MySQLUtil() {
}
public static String getDatumZaBazu(String korDatum) { try { return DateFormat.getDateInstance (DateFormat.MEDIUM, Locale.CANADA_FRENCH).format (DateFormat.getDateInstance (DateFormat.MEDIUM, Locale.GERMAN).parse(korDatum)); } catch(ParseException ex){return null;} } public static String getDatumZaKorisnik(String bazaDatum) { try { return DateFormat.getDateInstance (DateFormat.MEDIUM, Locale.GERMAN).format (DateFormat.getDateInstance (DateFormat.MEDIUM, Locale.CANADA_FRENCH).parse(bazaDatum)); } catch(ParseException ex){return null;} } }
Sada ćemo napisati kod za Osobu koji će obavljati svu potrebnu logiku za naš primjer. Znači tu ćemo napraviti metode, pored get i set metoda za atribute, još i metode koje će nam služiti za unos nove osobe, pretraživanje osobe, brisanje i ažuriranje podataka o postojećoj osobi (recimo promjena broja telefona. Evo sada koda klase osoba: package source; import import import import
java.sql.DriverManager; java.sql.SQLException; java.util.ArrayList; javax.swing.JOptionPane;
/** * Ova klasa je zadužena za kopletnu programsku logiku * koja će u ovome primjeru trebati * @author Amel Džanić */ public class Osoba { private String ime;
private String prezime; private String brTelefona; private int id; MySQLUtil kon = new MySQLUtil(); private ArrayList l = new ArrayList(); /* * Kreiranje praznog konsruktora * */ public Osoba(){ ime=null; prezime = null; brTelefona=null; } public Osoba(int id,String ime, String prezime, String brTelefona){ this.id=id; this.ime=ime; this.prezime=prezime; this.brTelefona= brTelefona; } public String getIme() { return ime; } public int getId(){ return id; } public void setIme(String ime) { this.ime = ime; } public String getPrezime() { return prezime; } public void setPrezime(String prezime) { this.prezime = prezime; } public String getBrTelefona() { return brTelefona; } public void setBrTelefona(String brTelefona) { this.brTelefona = brTelefona; } /** * Metoda zadužena za unos osobe u bazu podataka * @return true ako je unos uspio a ako ne false */ public boolean unosOsobe(){ String sqlUpit = "Insert into osoba values (0,'" + ime + "', '" + prezime + "','"+brTelefona+"')" ; try { kon.con=DriverManager.getConnection(MySQLUtil.BAZA_KON, MySQLUtil.BAZA_USER ,MySQLUtil.BAZA_PASSWORD); kon.stmt = kon.con.createStatement(); kon.stmt.execute(sqlUpit); kon.con.close(); return true; } catch(Exception ex){ JOptionPane.showMessageDialog(null, "Greška u SQL-u" ); ex.printStackTrace(); return false;} } /** * Metoa pretraga će izvršavati pretragu po imenu i prezimenu
* Ovakav način nije dobar u velikim bazama podataka ...... * @param ime string koji će sulužiti za pretragu po imenu * @param prezime string koji će služiti za pretragu po prezimenu * @return listu koja sadrži sve osobe koji zadovoljavaju upit */ public ArrayList pretraga(String ime, String prezime){ String sqlUpit = "Select * from osoba where " + "ime LIKE " + "'" + ime + "%'" + "and prezime LIKE " + "'" + prezime + "%'"; l.clear(); try{ kon.con=DriverManager.getConnection(MySQLUtil.BAZA_KON, MySQLUtil.BAZA_USER ,MySQLUtil.BAZA_PASSWORD); kon.stmt = kon.con.createStatement(); kon.rs = kon.stmt.executeQuery(sqlUpit); while (kon.rs.next()){ l.add(new Osoba (kon.rs.getInt(1) ,kon.rs.getString(2), kon.rs.getString(3), kon.rs.getString(4))); } kon.con.close(); return l; } catch (SQLException e){ JOptionPane.showMessageDialog(null, "Greška u SQL-u"); e.printStackTrace(); return null; } } /** * Metoda za brisanje osobe iz baze podataka * @param id jeste id osobe koja se briše iz baze * @return true ako je brisanje uspijelo, a ako ne false */ public boolean obrisiOsobu(int id){ String sqlUpit = "DELETE FROM osoba where id=" + id; try{ kon.con=DriverManager.getConnection(MySQLUtil.BAZA_KON, MySQLUtil.BAZA_USER ,MySQLUtil.BAZA_PASSWORD); kon.stmt = kon.con.createStatement(); kon.stmt.execute(sqlUpit); kon.con.close(); return true; } catch (SQLException e){ JOptionPane.showMessageDialog(null, "Greška u SQL-u"); e.printStackTrace(); return false; } } /** * Metoda koja ažirira podatke o osobi * @return true ako je ažuriranje uspijelo a ako ne false */ public boolean azurirajOsobu(){ //MySQLUtil kon=new MySQLUtil(); String sqlUpit="update osoba set ime='" + this.ime +"', prezime='" + this.prezime + "', brTelefona ='" + this.brTelefona + "' where id=" + try{ kon.con=DriverManager.getConnection(MySQLUtil.BAZA_KON, MySQLUtil.BAZA_USER ,MySQLUtil.BAZA_PASSWORD); kon.stmt = kon.con.createStatement(); kon.stmt.execute(sqlUpit); kon.con.close(); return true; } catch (SQLException e){ JOptionPane.showMessageDialog(null, "Greška u SQL-u");
this.id;
e.printStackTrace(); return false; } } public String toString(){ return id +" : " + ime + " }
" + prezime + " - " + brTelefona;
}
Sada kada smo to uradili idemo na izgradnju korisničkog interfejsa. Kreiraćemo glavni prozor (objekat tipa JFrame slika ) sa menijima, koji će onda otvarati pod prozore koje će obavljati odreñene funkcije (objekti tipa JInternalFrame).
Slika odabir objekta JFrame u paketu gui koji ćemo nazvati glavni. Prvo da pogledamo koje sve komponente imamo na raspolaganju na slici :
Slika Paleta komponenti Kada smo kreirali tu našu klasu glavni moramo sada uraditi sljedeće: - prvo ćemo sa palete komponenti SwingMenus nanijeti komponentu koja se naziva JMenuBar koja je kontejner za sve tipove menija (slika ). - Tada ćemo preimenovati jMenu2 Edit u naziv Akcije, i to što ćemo otići na properities od jMenu2 te na properitiesu tekxt upišemo naziv Akcija - Onda ćemo na meniju File dodati pod meni u kojem ćemo moći izaći iz aplikacije koji će nositi ime Exit prikazano na slici, te na properities od jMenuItem1 ćemo promjenti text na Exit. - Dalje ćemo na isti način na meju akcija napraviti četiri meniji , Unos, Brisanje, Ažuriranje i Pretraživanje, (slika ) - Sada kada smo to uradili moramo još da nanesemo kontejner za objekte InternalFrema a to je jDesktopPane koji se nalazi na paleti Swing Conteiners, te da ga proširiom po čitavom prozoru kao na slici
Slika Izgled naše aplikacije nakon nanošenja komponente JMenuBar Da bi sve ovo moglo raditi moramo imati aktivnu istancu konekcije za bazu podataka. Da bi to uradili moramo znati da nam je klasa glavni uvijek aktivna, te ako tu napravimo instancu nemamo potrebe da je igdje drugo pravimo. Instancu ćemo smjestiti u konstruktor klase glavna. Evo koda: public glavni() { initComponents(); try { Class.forName("com.mysql.jdbc.Driver").newInstance(); } catch (Exception ex) {return ;} }
Slika Properities od jMenu2
Slika kreiranje File menija sa pod menijem Exit
Slika kreiranje Akcija menija sa podmenijima
Slika gotov izgled glavnog prozora aplikacije
Kada smo izradili glavni prozor aplikacije, idemo iraditi ostale prozore koji će imati svoju funkciju( objekti JInternalFrame)
Slika Dodavanje novih klasa tipa JInternalFrame Prvo ćemo dadati klasu za Unos nove osobe u imenik. Kada ste kreirali klasu Unos koja je tipa JInternalFrame tada na properitiesima čekirajte properities closable te dadnite ime Unos osobe na properitiesu title. Ako ste to uradili dobiti ćete izgled kao na slici:
Slika Izgled JInternalFrame nakon odreñivanja propritiesa closable i title
Nakon toga nanesimo i ostale komponente te im promjenite opcije teksta kao na slici:
Kada ste to sve nacrtali sada ćemo se posvetiti kako da povežemo ovu formu sa glavnom formom i sa aplikacijskom logikom. Prvo otvorite source kod klase glavni pa negdje unutar klase (recimo ispod konstruktora) ubacite sljedeći kod /* * Privatna metoda koja nam služi za otvoranje JInternalFramea * moraju se uključiti sljedeći importi: * import java.beans.PropertyVetoException; * import javax.swing.JInternalFrame; * */ private void pokaziWindow(JInternalFrame j){ j.setVisible(true); jDesktopPane1.add(j); try{ j.setSelected(true); } catch (PropertyVetoException e) { } }
Kada ste to uradili moramo povezati InternalFrame sa dogañajem koji će se desiti kada na meniju unos kliknemo mišom, znači na jMenuItem2 treba da se izvrši dogañaj actionperformed
Slika Nakon toga će vam se otvoriti editor gdje ćete u datu metodu ukucati sljedeće: private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Unos u = new Unos(); pokaziWindow(u); }
Na taj smo način spojili naš internal frame sa aplikacijom sada ostaje da mu dodamo i funkcionalnost zašta on služi. No prije toga našoj aplikaciji moramo dodati konektor za MySQL a to se radi na sljedeći način: Odite na properities od projekta imenik – desnim dugmetom kliknite na imenik, dobiti ćete sljedeći prozor:
Odite na Libraries te uključite Jar datoteku mysql-connector-java-5.0.7-bin.jar
I tada ste uključili konektor. Sada se možemo vratiti pisanju funkcionalnosti našeg programa. Odima na klasu Unos te tu ćemo vidjeti da imamo dva buttona na čije dogañaje moramo reagirati. Prvi je buton Unesi koji kad se pritisne trebao bi da unese novu osobu u bazu podataka. Znači slično kao i kod menija imamo actionperformed dogañaj koji moramo obraditi i to sa sljedećim kodom: /* Unos Osobe u bazu * potrebni importi * import javax.swing.JOptionPane; * import source.Osoba; * */ private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Osoba o=new Osoba(); o.setIme(jTextField1.getText()); o.setPrezime(jTextField2.getText()); o.setBrTelefona(jTextField3.getText()); if(o.unosOsobe()){ JOptionPane.showMessageDialog(this,"Uspješan unos u bazu podataka"); } else JOptionPane.showMessageDialog(this,"Neuspješan unos u bazu podataka"); }
Klasa JoptionPane je u stvari prozor poruke koji nam javlja kako je naša akcija urañena. Još nam ostaje da možemo zatvoriti ovaj internal frame a to je akcija na button Exit. Na sličan način sada kreirajmo i ostale internal frameove naše aplikacije kao što su prikazani na slici
Komponenta JList
Ovaj prozor će nam služiti za sve ostale akcije koje trebamo da radimo, tako da ćemo malo programsku logiku ovdje imati složeniju (properities title ostavite prazan). Što se tiče brisanja itema s JList odite na properities model te će vam se otvoriti prozor gdje će te to obrisati. Sada ćemo opet otići na klasu glavni i povezati je sa ovom internal frame klasom pomoću sljedećeg koda: private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Pretrazivanje p = new Pretrazivanje("Brisanje", 0); pokaziWindow(p); } private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Pretrazivanje p = new Pretrazivanje("Ažuriranje", 1); pokaziWindow(p); } private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Pretrazivanje p = new Pretrazivanje("Pretraživanje", 2); pokaziWindow(p); }
Gdje ćemo zbog toga i u samoj klasi koju smo nazvali pretraživanje morati mjenjati konstruktor te dodati privatni atribu opcija, koji ćemo kasnije obajsniti. package gui; import import import import
java.util.ArrayList; javax.swing.DefaultListModel; javax.swing.JOptionPane; source.Osoba;
/** * * @author Administrator */ public class Pretrazivanje extends javax.swing.JInternalFrame private int opcija; private ArrayList l; private Osoba o = new Osoba();
/** Creates new form Pretrazivanje
{
* @param title naziv * @param opcija 0 brisanje * 1 ažuriranje * 2 pretraživanje */ public Pretrazivanje(String title, int opcija) { this.title=title; this.opcija=opcija; initComponents(); //Ako je pretraživanje ova dva buttona nam netrebaju if (opcija==2){ jButton2.setVisible(false);//brisanje jButton3.setVisible(false);//azuriranje } if (opcija==0) { jButton3.setVisible(false); jButton2.setEnabled(false); } if (opcija==1) { jButton2.setVisible(false); jButton3.setEnabled(false); }
}....
Ako ste sve ovo do sada uspješno uradili možete dobiti sljedeći prozor:
Sada idemo u pisanje logike. Prvo ćemo otići na opciju brisanja. Da bi mogli nešto da prišemo prvo moramo to odabrati. Sve dok JList komponenta nesadrži eleemente button za brisanje neće biti aktivan, isti slučaj je i sa Ažuriranjem. To postižete ako komponenti JList dodate dogañaj mouseclicked, te u tom kliku ako je odabran element tada će ova dva dugmeta biti omogućena. Evo koda za to: private void jList1MouseClicked(java.awt.event.MouseEvent evt) { // TODO add your handling code here: if(jList1.getSelectedIndex()>-1){ if(opcija==0)jButton2.setEnabled(true);
if(opcija==1)jButton3.setEnabled(true); } else { if(opcija==0)jButton2.setEnabled(false); if(opcija==1)jButton3.setEnabled(false); } }
No mora se još navesti da se properities od JList koji se naziva selectionMode mora postaviti na SINGLE. Sljedeće je način kako ćemo puniti komponentu JList, za tu svrhu iskoristili smo dogañaj na komponentama JTekstBox za unos imena ili unos prezimena, gdje kada se unese bilo koje slovo sa tastature aktivira dogañaj koji se zove KeyReleased. To ćete uraditi tako da kad odete na properities, kliknente na Events te nañete ovaj dogañaj što je prikazano na slici .
Slika odabir dogañaja za textField I tada će vam se otvoriti editor za kucanje koda gdje ćete unijeti sljedeći kod: private void jTextField1KeyReleased(java.awt.event.KeyEvent evt) { // TODO add your handling code here: l=null; l= o.pretraga(jTextField1.getText(), jTextField2.getText()); ispis(); } private void jTextField2KeyReleased(java.awt.event.KeyEvent evt) { // TODO add your handling code here: l=null; l= o.pretraga(jTextField1.getText(), jTextField2.getText()); ispis(); }
Nakon toga možete odabrati jedan od ponuñenih odgovora na vaš unos, te ga možete brisati ako ste odabrali brisanje, ili ga možete ažurirati. Kod za brisanje je: private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Osoba s=(Osoba)l.get(jList1.getSelectedIndex()); int i= JOptionPane.showOptionDialog (this, "Da li želite obrisati :" + s.toString(),"UPOZORENJE", JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE, null, null, this); if(i==0){ s=(Osoba)l.remove(jList1.getSelectedIndex()); //brisi(s.getId_sobe()); if(s.obrisiOsobu(s.getId())){ JOptionPane.showMessageDialog(this,"Uspješno brisanje podataka"); s=null; } else { JOptionPane.showMessageDialog(this,"Nespješno brisanje podataka"); s = null; } } if(l.size()==0) jButton2.setEnabled(false); l= o.pretraga(jTextField1.getText(), jTextField2.getText()); ispis(); jButton2.setEnabled(false); }
Kod ažuriranja je malo drugačije jer ćete morati doraditi klasu unos da nepravimo novi internalframe pa evo nadogradnji, imati ćemo dva konstruktora jedan kada je u pitanju Unos a drugi kada je u pitanju ažuriranje. Evo koda: public class Unos extends javax.swing.JInternalFrame { private Osoba o=null; private int mod; /** Creates new form Unos */ public Unos() { o=new Osoba() initComponents(); mod = 0;//Unos } public Unos(Osoba o){ initComponents(); mod=1; this.o=o; jTextField1.setText(o.getIme()); jTextField2.setText(o.getPrezime()); jTextField3.setText(o.getBrTelefona()); this.title="Ažuriranje " + o.getIme() + " " + o.getPrezime(); }
Takoñer ćemo modificirati i akciju na buttonu unesi. Evo koda: private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { o.setIme(jTextField1.getText()); o.setPrezime(jTextField2.getText()); o.setBrTelefona(jTextField3.getText()); if (mod==0){ if(o.unosOsobe()){ JOptionPane.showMessageDialog(this,"Uspješan unos u bazu podataka"); return; } else{ JOptionPane.showMessageDialog(this,"Neuspješan unos u bazu podataka"); return; } }
if (mod==1){ if(o.azurirajOsobu()){ JOptionPane.showMessageDialog(this,"Uspješno ažuriranje podataka"); return; } else { JOptionPane.showMessageDialog(this,"Neuspješno ažuriranje podataka"); return; } } }
Kada smo to uradili u klasi Unos, vratimo se na klase Pretraživanje i rješimo se sada dogañaja na buttonu ažuriranje, evo koda: private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Osoba s=(Osoba)l.get(jList1.getSelectedIndex()); Unos u = new Unos(s);//prosljedjuje se citav objekat u.setVisible(true); this.getParent().add(u); try{ u.setSelected(true); } catch (java.beans.PropertyVetoException e) { } }
No da bi sada sve to lijepo vidjeli kako to radi dodati ćemo ovoj klasi još jedan button koji ćemo staviti tekst Osvježi kao na slici
Slika novi izgled Te akcija koja je potrebna za to: private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) { l= o.pretraga(jTextField1.getText(), jTextField2.getText()); ispis(); }
Te na krau pomoćna metoda ispis koja ispinjava JList komponentu: private void ispis(){ DefaultListModel lm = new DefaultListModel(); for(int i = 0; i
Prilog kod svih klasa za GUI: Datoteka : glavni.java /* * glavni.java * * Created on 2008. svibanj 19, 14:52 */ package gui; import java.beans.PropertyVetoException; import javax.swing.JInternalFrame; /** * * @author Administrator */ public class glavni extends javax.swing.JFrame { /** Creates new form glavni */ public glavni() { initComponents(); try { Class.forName("com.mysql.jdbc.Driver").newInstance(); } catch (Exception ex) {return ;} } /* * Privatna metoda koja nam služi za otvoranje JInternalFramea * moraju se uključiti sljedeći importi: * import java.beans.PropertyVetoException; * import javax.swing.JInternalFrame; * */ private void pokaziWindow(JInternalFrame j){ j.setVisible(true); jDesktopPane1.add(j); try{ j.setSelected(true); } catch (PropertyVetoException e) { } } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jDesktopPane1 = new javax.swing.JDesktopPane(); jMenuBar1 = new javax.swing.JMenuBar(); jMenu1 = new javax.swing.JMenu(); jMenuItem1 = new javax.swing.JMenuItem(); jMenu2 = new javax.swing.JMenu(); jMenuItem2 = new javax.swing.JMenuItem(); jMenuItem3 = new javax.swing.JMenuItem(); jMenuItem4 = new javax.swing.JMenuItem(); jMenuItem5 = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jMenu1.setText("File");
jMenuItem1.setText("Exit"); jMenuItem1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem1ActionPerformed(evt); } }); jMenu1.add(jMenuItem1); jMenuBar1.add(jMenu1); jMenu2.setText("Akcija"); jMenuItem2.setText("Unos"); jMenuItem2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem2ActionPerformed(evt); } }); jMenu2.add(jMenuItem2); jMenuItem3.setText("Brisanje"); jMenuItem3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem3ActionPerformed(evt); } }); jMenu2.add(jMenuItem3); jMenuItem4.setText("Ažuriranje"); jMenuItem4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem4ActionPerformed(evt); } }); jMenu2.add(jMenuItem4); jMenuItem5.setText("Pretraživanje"); jMenuItem5.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem5ActionPerformed(evt); } }); jMenu2.add(jMenuItem5); jMenuBar1.add(jMenu2); setJMenuBar(jMenuBar1); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jDesktopPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jDesktopPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE) ); pack(); }// private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Unos u = new Unos(); pokaziWindow(u); } private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here: Pretrazivanje p = new Pretrazivanje("Brisanje", 0); pokaziWindow(p); } private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Pretrazivanje p = new Pretrazivanje("Ažuriranje", 1); pokaziWindow(p); } private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Pretrazivanje p = new Pretrazivanje("Pretraživanje", 2); pokaziWindow(p); } private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: this.dispose(); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new glavni().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JDesktopPane jDesktopPane1; private javax.swing.JMenu jMenu1; private javax.swing.JMenu jMenu2; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JMenuItem jMenuItem1; private javax.swing.JMenuItem jMenuItem2; private javax.swing.JMenuItem jMenuItem3; private javax.swing.JMenuItem jMenuItem4; private javax.swing.JMenuItem jMenuItem5; // End of variables declaration } Datoteka Unos.java /* * Unos.java * * Created on 2008. svibanj 19, 15:29 */ package gui; import javax.swing.JOptionPane; import source.Osoba; /** * * @author Administrator */ public class Unos extends javax.swing.JInternalFrame private Osoba o=null; private int mod; /** Creates new form Unos */ public Unos() { o = new Osoba(); initComponents(); mod = 0;//Unos
{
} public Unos(Osoba o){ initComponents(); mod=1; this.o=o; jTextField1.setText(o.getIme()); jTextField2.setText(o.getPrezime()); jTextField3.setText(o.getBrTelefona()); this.title="Ažuriranje " + o.getIme() + " " + o.getPrezime(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTextField(); jTextField2 = new javax.swing.JTextField(); jTextField3 = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); setClosable(true); setTitle("Unos Osobe"); jLabel1.setText("Ime"); jLabel2.setText("Prezime"); jLabel3.setText("Broj telefona"); jTextField1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jTextField1ActionPerformed(evt); } }); jButton1.setText("Unesi"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jButton2.setText("Exit"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1)) .addGroup(layout.createSequentialGroup()
.addContainerGap() .addComponent(jLabel2)) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel3))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 212, Short.MAX_VALUE) .addComponent(jTextField2, javax.swing.GroupLayout.DEFAULT_SIZE, 212, Short.MAX_VALUE) .addComponent(jTextField3, javax.swing.GroupLayout.DEFAULT_SIZE, 212, Short.MAX_VALUE))) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addComponent(jButton1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButton2))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(30, 30, 30) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel1)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel2)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel3)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jButton2) .addComponent(jButton1)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); pack(); }// private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } /* Unos Osobe u bazu * potrebni importi * import javax.swing.JOptionPane; * import source.Osoba; * */ private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { o.setIme(jTextField1.getText()); o.setPrezime(jTextField2.getText()); o.setBrTelefona(jTextField3.getText()); if (mod==0){ if(o.unosOsobe()){ JOptionPane.showMessageDialog(this,"Uspješan unos u bazu podataka");
return; } else{ JOptionPane.showMessageDialog(this,"Neuspješan unos u bazu podataka"); return; } } if (mod==1){ if(o.azurirajOsobu()){ JOptionPane.showMessageDialog(this,"Uspješno ažuriranje podataka"); return; } else { JOptionPane.showMessageDialog(this,"Neuspješno ažuriranje podataka"); return; } } } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: this.dispose(); }
// Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JTextField jTextField1; private javax.swing.JTextField jTextField2; private javax.swing.JTextField jTextField3; // End of variables declaration
} Datoteka Pretrazivanje.java /* * Pretrazivanje.java * * Created on 2008. svibanj 19, 16:28 */ package gui; import import import import
java.util.ArrayList; javax.swing.DefaultListModel; javax.swing.JOptionPane; source.Osoba;
/** * * @author Administrator */ public class Pretrazivanje extends javax.swing.JInternalFrame private int opcija; private ArrayList l; private Osoba o = new Osoba();
/** Creates new form Pretrazivanje * @param title naziv * @param opcija 0 brisanje * 1 ažuriranje * 2 pretraživanje */ public Pretrazivanje(String title, int opcija) {
{
this.title=title; this.opcija=opcija; initComponents(); //Ako je pretraživanje ova dva buttona nam netrebaju if (opcija==2){ jButton2.setVisible(false);//brisanje jButton3.setVisible(false);//azuriranje } if (opcija==0) { jButton3.setVisible(false); jButton2.setEnabled(false); } if (opcija==1) { jButton2.setVisible(false); jButton3.setEnabled(false); }
} /* * * */ private void ispis(){ DefaultListModel lm = new DefaultListModel(); for(int i = 0; i private void initComponents() { jLabel1 = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); jTextField2 = new javax.swing.JTextField(); jScrollPane1 = new javax.swing.JScrollPane(); jList1 = new javax.swing.JList(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton(); jButton4 = new javax.swing.JButton(); setClosable(true); jLabel1.setText("Ime"); jTextField1.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(java.awt.event.KeyEvent evt) { jTextField1KeyReleased(evt); } }); jLabel2.setText("Prezime"); jTextField2.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(java.awt.event.KeyEvent evt) { jTextField2KeyReleased(evt); } }); jList1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jList1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jList1MouseClicked(evt); } }); jScrollPane1.setViewportView(jList1); jButton1.setText("Exit"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jButton2.setText("Obriši"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jButton3.setText("Ažuriraj"); jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton3ActionPerformed(evt); } }); jButton4.setText("Osvježi"); jButton4.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton4ActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 363, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 144, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 152, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jButton4) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 105, Short.MAX_VALUE) .addComponent(jButton3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButton2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButton1)))
.addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(22, 22, 22) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel2) .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jButton1) .addComponent(jButton2) .addComponent(jButton3) .addComponent(jButton4)) .addContainerGap(15, Short.MAX_VALUE)) ); pack(); }// private void jTextField1KeyReleased(java.awt.event.KeyEvent evt) { // TODO add your handling code here: l=null; l= o.pretraga(jTextField1.getText(), jTextField2.getText()); ispis(); } private void jTextField2KeyReleased(java.awt.event.KeyEvent evt) { // TODO add your handling code here: l=null; l= o.pretraga(jTextField1.getText(), jTextField2.getText()); ispis(); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: this.dispose(); } //Brisanje private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Osoba s=(Osoba)l.get(jList1.getSelectedIndex()); int i= JOptionPane.showOptionDialog(this, "Da li želite obrisati :" + s.toString(), "UPOZORENJE",JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE, null, null, this); if(i==0){ s=(Osoba)l.remove(jList1.getSelectedIndex()); //brisi(s.getId_sobe()); if(s.obrisiOsobu(s.getId())){ JOptionPane.showMessageDialog(this,"Uspješno brisanje podataka"); s=null; } else { JOptionPane.showMessageDialog(this,"Nespješno brisanje podataka"); s = null; } } if(l.size()==0) jButton2.setEnabled(false); l= o.pretraga(jTextField1.getText(), jTextField2.getText()); ispis(); jButton2.setEnabled(false);
} private void jList1MouseClicked(java.awt.event.MouseEvent evt) { // TODO add your handling code here: if(jList1.getSelectedIndex()>-1){ if(opcija==0)jButton2.setEnabled(true); if(opcija==1)jButton3.setEnabled(true); } else { if(opcija==0)jButton2.setEnabled(false); if(opcija==1)jButton3.setEnabled(false); } } private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: Osoba s=(Osoba)l.get(jList1.getSelectedIndex()); Unos u = new Unos(s);//prosljedjuje se citav objekat u.setVisible(true); this.getParent().add(u); try{ u.setSelected(true); } catch (java.beans.PropertyVetoException e) { } } private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: l= o.pretraga(jTextField1.getText(), jTextField2.getText()); ispis(); }
// Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JButton jButton3; private javax.swing.JButton jButton4; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JList jList1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextField jTextField1; private javax.swing.JTextField jTextField2; // End of variables declaration }