Grafičke biblioteke java. Kratak pregled Java GUI okvira i moje prve jednostavne Swing GUI aplikacije

Dakle, implementirana je logika igre života. Voleo bih da uživam u procesu kontemplacije različitosti oblika „Života“ na ekranu svog monitora. Šta će biti potrebno za ovo?

Sam prozor sa menijima i dugmadima, kao i njegovo ponašanje kreiraće se pomoću biblioteke Swing. Crtanje procesa evolucije našeg "Života" - kroz biblioteku A.W.T.(tačnije, Java 2D). Ovo su dva glavna paketa za kreiranje GUI-ja u Javi.

Rad AWT-a se u početku zasniva na takozvanim ravnopravnim interfejsima. Suština je da ako je potrebno prikazati Java objekat na ekranu, operativni sistem za njega kreira upareni grafički objekat, koji se, u stvari, prikazuje. Ova dva objekta komuniciraju jedan s drugim dok je program pokrenut. Ova implementacija dovodi do činjenice da svaka platforma mora izdati svoj JDK.

Kasnije je AWT kreirao komponente koje ne koriste ravnopravna sučelja - "lake" (lake) komponente. Biblioteka ovih komponenti je nazvana Swing. To jest, Swing je, u stvari, produžetak AWT-a.

Sam AWT je dopunjen novim alatima za crtanje i prikaz slika tzv Java 2D.

Navest ću sa kratkim opisom glavne elemente Swinga.

Osnovni gradivni blok cijele Swing biblioteke vizualnih komponenti je JComponent. Ovo je superklasa svake komponente. To je apstraktna klasa, tako da ne možete stvarno kreirati JComponent, ali sadrži doslovno stotine funkcija koje svaka Swing komponenta može koristiti kao rezultat hijerarhije klasa.

jFrame(prozor aplikacije) - glavni kontejner koji vam omogućava da sebi dodate druge komponente kako biste ih organizirali i pružili korisniku. JFrame djeluje kao most između OS nezavisnih Swing dijelova i stvarnog OS-a na kojem rade. JFrame je registrovan kao prozor sa OS-om i tako dobija mnoga poznata svojstva prozora operativni sistem.

JMenu/JMenuItem/JMenuBar- dizajniran za razvoj sistema menija u JFrame-u. Okosnica svakog sistema menija je JMenuBar, svaki JMenu i JMenuItem se kreiraju sa njim. JMenu je podklasa JMenuItem. Međutim, razlikuju se po izgledu: JMenu se koristi da sadrži druge JMenuItem i JMenu; JMenuItem aktivira radnju kada je odabrana.

JLabel(oznaka) - koristi se za opisivanje (tekstualnih ili grafičkih) drugih elemenata.

jButton(dugme) - glavna aktivna komponenta koja vam omogućava da izvršite neku radnju kada se pritisne. Pored standardnih metoda koje kontrolišu prikaz komponente, sadrži grupu metoda za upravljanje njenim stanjem (aktivno/neaktivno, odabrano/nije odabrano, miš gore/nema miša, pritisnut/otpušten).

JTextField(tekstualno polje) - omogućava korisniku da unese tekstualne podatke koji se mogu obraditi u programu.

JTextArea proširuje JTextField kako bi omogućio unos više redova.

JPasswordField(polje lozinke) - tip JTextField koji vam omogućava da sakrijete znakove koje unosite.

JComboBox(kombinovana lista) - Omogućava korisniku da izabere stavku sa postojeće liste (ili doda novu stavku na listu).

JCheckBox(kvačica) i JRadioButton(radio dugme) - Pruža opcije koje korisnik može izabrati. JRadioButtons se obično grupišu zajedno kako bi korisniku pružili pitanje sa prinudnim odgovorom (odgovori se međusobno isključuju – može postojati samo jedan odgovor po pitanju). Jednom kada odaberete JRadioButton, ne možete ga poništiti dok ne odaberete drugu opciju iz grupe. JCheckBox radi drugačije. Omogućava vam da u svakom trenutku označite/poništite izbor opcije i odaberete više odgovora po pitanju. Klasa koja omogućava grupisanje komponenti JCheckBox ili JRadioButton zajedno je klasa ButtonGroup.

JSlider— element za odabir numeričke vrijednosti iz grafički predstavljenog raspona.

JSpinner- je za odabir iz grupe vrijednosti. Po tome je sličan JComboBoxu, iako njihova upotreba ne bi trebala biti zamjenjiva. Trebali biste koristiti JSpinner samo za logički sekvencijalne izbore - brojevi i datumi su savršeni za ovo. JComboBox je, s druge strane, više dobar izbor da predstavljaju naizgled nasumične opcije koje nemaju nikakve veze jedna s drugom.

JToolBar djeluje kao kontejner za druge komponente (JButtons, JComboBox, itd.) koje zajedno formiraju trake s alatima koje se nalaze u većini aplikacija. Trake sa alatkama omogućavaju programu da postavi često korišćene komande na pogodno mesto i grupiše ih. Tipično, dugmad na traci sa alatkama odgovaraju komandama u meniju.

JToolTip- Ovo su mali "mjehurići" koji iskaču kada zadržite pokazivač miša iznad nečega. Oni mogu biti vrlo korisni u aplikacijama, pružajući savjete za elemente, detaljne informacije ili čak prikazujući cijeli tekst elementa u sažetom korisničkom sučelju. Oni se aktiviraju u Swingu tako što se kursor miša ostavi preko komponente određeno vrijeme; obično se pojavljuju otprilike jednu sekundu nakon što se miš zaustavi i ostaju vidljivi sve dok kursor ostaje iznad komponente.

JOptionPane- klasa za pružanje UI programerima način da izdaju jednostavne poruke (greška ili druge informacije) i brzo primaju podatke (na primjer, ime ili broj).

jscrollpane- Swing komponenta za rukovanje svim radnjama pomicanja.

jlist je korisna komponenta koja korisniku pruža mnogo opcija za izbor. Možete razmišljati o tome kao o JComboBox ekstenziji. JList pruža više izbora i dodaje mogućnost odabira višestrukih izbora. Izbor između JList i JComboBox često je jedan od sljedećih: Ako trebate više izbora ili imate više od 15 izbora (iako ovaj broj nije opšte pravilo), uvijek biste trebali odabrati JList. Trebali biste koristiti JList zajedno sa JScrollPane jer može pružiti više opcija nego što će stati u vidljivo područje. JList također ima odabrani model koji možete postaviti Razne vrste izbor opcija. Ove vrste su: jedan izbor (možete odabrati samo jednu opciju), pojedinačni raspon (možete odabrati bilo koji broj susjednih opcija) i višestruki raspon (možete odabrati bilo koji broj opcija u bilo kojoj kombinaciji).

Grafički interfejs u Javi prošao je veoma trnovit put razvoja i formiranja. Dugo su ga optuživali za spor rad, pohlepu za sistemskim resursima i ograničenu funkcionalnost.

Java AWT

Sun-ov prvi pokušaj GUI za Javu bila je biblioteka A.W.T.(Abstract Window Toolkit) - alat za rad sa različitim prozorskim okruženjima. Sun je napravio Java sloj koji poziva metode iz biblioteka napisanih u C. Metode AWT biblioteke kreiraju i koriste grafičke komponente operativnog okruženja. S jedne strane, ovo je dobro, jer je Java program sličan drugim programima unutar istog OS-a. Ali kada ga pokrenete na drugoj platformi, mogu postojati razlike u veličinama komponenti i fontova koji će pokvariti izgled programe.

Da bi se osiguralo više platformi A.W.T. interfejsi poziva komponenti su ujedinjeni, što je rezultiralo neznatno smanjenom funkcionalnošću. A skup komponenti se pokazao prilično malim. Na primjer, u AWT-u nema tabela, a ikone nisu podržane u dugmadima. Međutim, paket java.awt uključen u Javu od prvog izdanja i može se koristiti za kreiranje GUI-ja.

Dakle, komponente A.W.T. ne radi nikakav "rad". To je samo "Java omotač" za kontrole operativnog sistema na kojem rade. Svi zahtjevi prema ovim komponentama se preusmjeravaju na operativni sistem, koji obavlja sav posao.

Korišteni resursi A.W.T. pokušava da se automatski oslobodi. Ovo malo komplikuje arhitekturu i utiče na performanse. Pisanje nečeg ozbiljnog koristeći AWT će biti pomalo teško. Sada se koristi samo za aplete.

Osnovni SWING koncepti

Poslije A.W.T. Sun je razvio biblioteku grafičkih komponenti Swing, napisan u potpunosti na Javi. Za renderiranje se koristi 2D, što sa sobom donosi nekoliko prednosti odjednom. Skup standardnih komponenti daleko prevazilazi AWT u pogledu raznolikosti i funkcionalnosti. Swing olakšava kreiranje novih komponenti nasljeđujući postojeće i podržava različite stilove i skinove.

Kreatori nove UI biblioteke Swing nisu "izmislili točak" i izabrali su AWT kao osnovu za svoju biblioteku. Naravno, nismo govorili o upotrebi specifičnih teških AWT komponenti (predstavljenih Button, Label i sličnim klasama). Samo lagane komponente davale su potreban stepen fleksibilnosti i kontrole. Dijagram nasljeđivanja pokazuje odnos između AWT i Swinga.

Najvažnija razlika Swing od AWT-a je da Swing komponente uopšte nisu povezane sa operativnim sistemom i stoga su mnogo stabilnije i brže. Takve komponente se u Javi nazivaju lakim, a razumijevanje osnovnih principa njihovog rada će uvelike objasniti kako Swing funkcionira.

Swing Kontejneri najvišeg nivoa

Za stvaranje GUI aplikacije moraju koristiti posebne komponente Swing biblioteke koje se nazivaju kontejneri vrhunski nivo(kontejneri najvišeg nivoa). Oni su prozori operativnog sistema koji hostuju komponente korisničkog interfejsa. Kontejneri najvišeg nivoa uključuju prozore JFrame i JWindow, dijaloški okvir JDialog i JApplet aplet (koji nije prozor, ali je također namijenjen za prikaz interfejsa u pretraživaču koji pokreće ovaj aplet). Swing kontejneri najvišeg nivoa su teške komponente i izuzetak su od općeg pravila. Sve ostale komponente Swinga su lagane.

Jednostavno Swing primjer prozorskog interfejsa jFrame.

Import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JLabel; javna klasa JFrameTest ( public static void createGUI() (JFrame frame = new JFrame("Test frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label = new JLabel("Test label"); frame.getContentPane(). add(label); frame.setPreferredSize(new Dimension(200, 100)); frame.pack(); frame.setVisible(true); ) public static void main(String args) (JFrame.setDefaultLookAndFeelDecorated(true); javax. swing.SwingUtilities.invokeLater(new Runnable() (javno void run() ( createGUI(); ) )); ) )

Konstruktor JFrame() bez parametara kreira prazan prozor. Konstruktor JFrame (naslov niza) kreira prazan prozor sa naslovom naslova. Stvoriti najjednostavniji program sa praznim prozorom, moraju se koristiti sljedeće metode:

  • setSize(int width, int height) - definiranje veličine prozora;
  • setDefaultCloseOperation(int operation) - definicija akcije po završetku programa;
  • setVisible(boolean visible) - učinite prozor vidljivim.

Ako ne definirate veličinu prozora, onda će on imati nultu visinu bez obzira na to što se nalazi u njemu. Dimenzije prozora uključuju ne samo "radnu" oblast, već i ivice i naslovnu traku.

Metoda setDefaultCloseOperation definira radnju koju treba poduzeti prilikom "izlaska iz programa". Da biste to učinili, proslijedite konstantu EXIT_ON_CLOSE, opisanu u klasi JFrame, kao parametar operacije.

Po defaultu, prozor je kreiran nevidljiv. Za prikaz prozora na ekranu poziva se metoda setVisible sa parametrom true. Ako ga pozovete sa parametrom false, prozor će postati nevidljiv.

GUI java swing primjer kreiranja prozora jFrame prikazano na sljedećoj slici.

Za povezivanje biblioteke Swing aplikacija treba da uveze biblioteku javax.swing.

Svaki put kada se kreira kontejner najvišeg nivoa, bilo da se radi o normalnom prozoru, dijaloškom okviru ili apletu, konstruktor kontejnera kreira JRootPane root panel. Swing kontejneri najvišeg nivoa osiguravaju da druge komponente ne mogu "puzati" izvan JRootPane-a.

Root Pale JRootPane dodaje svojstvo "dubine" kontejnerima, pružajući mogućnost ne samo postavljanja komponenti jedna iznad druge, već i, ako je potrebno, njihove zamjene, povećanja ili smanjenja dubine komponenti. Ova funkcija je neophodna kada kreirate aplikaciju sa više dokumenata. Swing, čiji prozori predstavljaju lagane komponente naslagane jedna na drugu, kao i padajuće (kontekstne) menije i opise alata.

Sljedeća slika jasno pokazuje strukturu korijenskog panela JRootPane.

Root panel JRootPane je kontejner koji nasljeđuje od osnovne klase Swing JComponent. U ovom kontejneru, poseban menadžer rasporeda, implementiran u internu klasu RootPaneLayout, odgovoran je za raspored komponenti. Ovaj menadžer rasporeda je odgovoran za to da svi sastavni dijelovi korijenskog panela budu postavljeni kako bi trebali biti: slojeviti panel zauzima cijeli prostor prozora; njegov FRAME_CONTENT_LAYER sadrži traku menija i panel sa sadržajem, a iznad svega je transparentan panel.

Sve komponente root panela JRootPane može se nabaviti ili promijeniti. Za ovo ima skup get/set metoda. Programski JRootPane može se dobiti pomoću metode getRootPane().

Pored kontejnera najvišeg nivoa, korijensko okno se koristi u internim JInternalFrame prozorima kreiranim u aplikacijama sa više dokumenata i nalazi se na "desktop" JDesktopPane-u. To vam omogućava da zaboravite da su ovi prozori obične lagane komponente i radite s njima kao da su pravi kontejneri najvišeg nivoa.

Layered Panel JLayeredPane

U osnovi korijenskog panela (kontejnera) leži takozvani slojeviti panel JLayeredPane A koji zauzima sav raspoloživi prostor u kontejneru. U ovom panelu se nalaze svi ostali delovi glavnog panela, uključujući sve komponente korisničkog interfejsa.

JLayeredPane koristi se za dodavanje svojstva dubine u kontejner. To jest, višeslojni panel vam omogućava da organizirate treću dimenziju u kontejneru, duž koje se nalaze slojevi (slojevi) komponente. U normalnom kontejneru, lokacija komponente je određena pravokutnikom koji pokazuje koliki dio kontejnera komponenta zauzima. Kada dodajete komponentu na višeslojni panel, morate navesti ne samo pravougaonik koji komponenta zauzima, već i sloj u kojem će se nalaziti. Sloj u slojevitom panelu definiran je cijelim brojem. Što je veći broj koji definira sloj, to je sloj viši.

Prva komponenta dodana u kontejner je viša od komponenti dodatih kasnije. Najčešće se programer ne bavi pozicijama komponenti. Kada dodate komponente, njihov položaj se automatski mijenja. Međutim, slojeviti panel vam omogućava da dinamički promijenite položaj komponenti, nakon što se dodaju u kontejner.

Neke komponente naširoko koriste mogućnosti slojevite ploče Swing. Posebno su važni za aplikacije sa više dokumenata, opise alata i menije. Multidocument Swing aplikacije koriste poseban kontejner JDesktopPane("desktop") naslijeđen od JLayeredPane A koji drži unutrašnje Swing prozore. Većina važne karakteristike Višedokumentna aplikacija - lokacija "aktivnog" prozora iznad ostalih, minimiziranje prozora, njihovo prevlačenje - obezbjeđuju se mehanizmima višeslojnog panela. Glavna prednost korištenja slojevite ploče za opise alata i menije je njihova brzina. Umjesto kreiranja novog teškog prozora za svaki opis alata ili meni, koji se nalazi iznad komponente u kojoj je zatražen opis alata ili meni, Swing stvara brzu laganu komponentu. Ova komponenta je postavljena u dovoljno visok sloj slojevite ploče iznad u hrpu svih ostalih komponenti i koristi se za prikaz opisa alata ili menija.

Višeslojni panel vam omogućava da organizujete neograničen broj slojeva. Struktura JLayeredPane uključuje nekoliko standardnih slojeva, koje koriste sve Swing komponente, što osigurava da svi mehanizmi slojevite ploče rade ispravno. Standardni slojevi JLayeredPane prikazani su na sljedećoj slici.

Podrazumevani sloj se koristi za hostovanje svih normalnih komponenti koje se dodaju u kontejner. Ovaj sloj sadrži unutrašnje prozore aplikacija sa više dokumenata.

Sloj Paleta je dizajniran da ugosti prozore sa skupom alata, koji se obično preklapaju sa ostatkom interfejsa. Panel JDesktopPane vam omogućava da kreirate takve prozore, koji ih postavljaju na ovaj sloj.

Modalni sloj je bio namijenjen za smještaj lakih modalnih dijaloških okvira. Međutim, takvi dijaloški okviri još nisu implementirani, tako da se ovaj sloj trenutno ne koristi u Swingu.

Sloj koji se najčešće koristi za iskačuće menije i opise alata.

Najviši sloj. Dizajniran za operacije prevlačenja i ispuštanja, koje bi trebalo da budu jasno vidljive u interfejsu programa.

Mali primjer JLayeredPane-a sa slojevitim panelom pokazuje kako dodati komponente u različite slojeve i kako se slojevi slažu jedan na drugi:

Uvezi javax.swing.*; import java.awt.*; // klasa za crtanje dvije vrste figura s tekstualnom klasom Figure proširuje JComponent (privatna static final long serialVersionUID = 1L; privatna boja boja; privatni tip int; privatni string tekst; // parametri: boja i tip figure Figure(boja boje, int type, String text) ( this.color = boja; this.type = type; this.text = text; setOpaque(false); ) public void paintComponent(Graphics g) ( // crtanje figure g.setColor(color); prekidač (tip ) ( slučaj 0: g.fillOval(0, 0, 90, 90); prekid; slučaj 1: g.fillRect(0, 0, 130, 80); prekid; ) g.setColor(Color.yellow) ; g. drawString(text, 10, 35); ) ) javna klasa JLayeredPaneTest proširuje JFrame (privatni statički konačni dugi serialVersionUID = 1L; javni JLayeredPaneTest() ( // kreiranje prozora super("Primjer LayeredTest"); // izlaz kada prozor je zatvoreno setDefaultCloseOperation( EXIT_ON_CLOSE); // definiraj slojevitu ploču JLayeredPane lp = getLayeredPane(); // kreiraj tri oblika Figure figure1 = new Figure(Color.red , 0, "Slika po štene"); Slika broj 2 = nova slika(Boja.plava, 0, "Slika 1"); Slika broj 3 = nova slika(Boja.cijan, 1, "Slika 2"); // odredimo lokaciju figura u prozoru figure1.setBounds(10, 40, 120, 120); figure2.setBounds(60, 120, 160, 180); figure3.setBounds(90, 55, 250, 180); // dodavanje oblika u različite slojeve lp.add(figure1, JLayeredPane.POPUP_LAYER); lp.add(slika2, JLayeredPane.PALETTE_LAYER); lp.add(slika3, JLayeredPane.PALETTE_LAYER); // mijenjamo poziciju jedne od figura lp.setPosition(figure3, 0); // određivanje veličine i otvaranje prozora setSize(280, 250); setVisible(true); ) public static void main(String args) ( JFrame.setDefaultLookAndFeelDecorated(true); new JLayeredPaneTest(); ) )

Primjer kreira mali prozor jFrame a višestruke komponente Figure se dodaju na slojevitu ploču. Da biste dobili slojevit panel u bilo kojem Swing kontejneru najvišeg nivoa, samo pozovite metodu getLayeredPane().

Pomoćna klasa Figure nasljeđuje svojstva osnovne klase JComponent i omogućava vam da nacrtate dvije vrste oblika (krugovi i pravokutnici) različitim bojama. Parametri za crtanje oblika se postavljaju u konstruktoru klase.

Prilikom definiranja interfejsa kreiraju se tri oblika različitih boja (dva kruga i pravougaonik). Krug je postavljen u sloj POPUP_LAYER, a pravokutnici u sloj PALETTE_LAYER. Prilikom postavljanja komponenti, specificiraju se njihove apsolutne koordinate ekrana, jer uobičajeni upravitelji lokacija ne rade u slojevitom panelu.

Na kraju se mijenja pozicija jednog od pravougaonika tako da je prvi u sloju, iako mu je prvobitno dodat drugi. Kada pokrenete aplikaciju, vidjet ćete da slojeviti panel radi i da uredno raspoređuje komponente prema njihovim slojevima i pozicijama.

U konvencionalnim aplikacijama, slojeviti panel se rijetko koristi direktno, u kojem svoje funkcije obavlja nevidljivo. Međutim, ponekad pomaže stvaranje nevjerovatnih efekata i neobičnih sučelja, na primjer, omogućavajući vam da postavite animaciju ili video na vrh običnih komponenti bez potrebe za nadljudskim naporima i trikovima od programera.

ContentPane

ContentPane je sljedeći dio glavnog okna i koristi se za hostovanje komponenti korisničkog interfejsa programa. ContentPane zauzima većinu prostora slojevite ploče (osim prostora koji zauzima traka menija). Kako bi se spriječilo da panel sa sadržajem pokrije komponente koje su kasnije dodane prozoru, slojeviti panel ga postavlja na poseban vrlo niski sloj pod nazivom FRAME_CONTENT_LAYER, pod brojem -30000.

Možete pristupiti panelu sadržaja koristeći getContentPane() JFrame klasa. Koristeći metodu add(komponentna komponenta), možete joj dodati bilo koju kontrolu. Zamijenite ContentPane bilo koji drugi panel tipa JPanel, možete koristiti metodu setContentPane()

Primjer dodavanja dugmeta na panel sa sadržajem:

JButton newButton = novi JButton(); getContentPane().add(newButton);

Kao rezultat, dobijamo prozor sa dugmetom. Dugme zauzima cijelo dostupno područje prozora. Ovaj efekat nije koristan u svim programima, tako da morate koristiti različite načine da rasporedite elemente na panelu.

Panel sa sadržajem može se potpuno zamijeniti. Uzmite u obzir sljedeće Swing primjer panela sa sadržajem ContentPane.

Uvezi javax.swing.*; javna klasa ContentPaneReplace proširuje JFrame (privatni statički konačni dugi serialVersionUID = 1L; javni ContentPaneReplace() ( super("Test ContentPane"); setDefaultCloseOperation(EXIT_ON_CLOSE); // Kreirajte panel sa dva dugmeta JPanel contents = new JPanel(); contents. add (new JButton("Family")); contents.add(new JButton("School")); // Zamjena okna sadržaja setContentPane(contents); // Određivanje veličine prozora setSize(200, 100); // Otvaranje prozora setVisible (true); ) public static void main(String args) ( JFrame.setDefaultLookAndFeelDecorated(true); new ContentPaneAdd(); ) )

Primer kreira mali prozor i panel sa dva dugmeta, što je onda setContentPane() zamjenjuje okno sa sadržajem prozora. Stoga je umjesto jednostavnijeg dodavanja korištena zamjena - pozivanje metode add (). Interfejs prozora je prikazan na sljedećem snimku ekrana.

Panel sa sadržajem ContentPane samo po sebi nije ništa posebno. Samo trebate zapamtiti da su mu komponente dodane.

Transparentni JOptionPane

Transparent panel JOptionPane postavljen kao korijenski panel iznad svih elemenata slojevite ploče. Postavljanjem JOptionPane upravlja korijensko okno, koje postavlja prozirno okno iznad slojevitog okna tako da u potpunosti pokriva cijelo područje prozora, uključujući područje koje zauzima traka menija.

JOptionPane se rijetko koristi u aplikacijama, tako da ga po defaultu root panel čini nevidljivim, što smanjuje opterećenje sistema za crtanje. Imajte na umu da ako učinite transparentan panel vidljivim, morate biti sigurni da je transparentan (njegovo svojstvo neprozirnosti je lažno), jer će u suprotnom pokriti sve ostale elemente korijenskog panela, a ostatak sučelja će biti nevidljiv.

U kojim slučajevima se može koristiti prozirna ploča? JOptionPane? Može se koristiti za definiranje karakteristika aplikacije koje bi zahtijevale značajan napor za implementaciju od nule. Transparentni panel se može prilagoditi za automatsko testiranje korisničkog interfejsa. Događaji sintetizirani u njemu omogućavaju vam praćenje međurezultata otklanjanja grešaka. Ponekad je ovaj pristup mnogo efikasniji od ručnog testiranja.

Transparent panel JOptionPane može se koristiti za pravljenje otmjenih animacija koje "lebde" na vrhu svih komponenti, uključujući traku menija, ili za hvatanje događaja ako se nekima od njih treba rukovati prije slanja u glavno korisničko sučelje.

Primjer korištenja transparentnog Swing JOptionPane-a:

// Korištenje transparentnog JOptionPane import java.awt.Dimension; import java.awt.Font; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.UIManager; javna klasa JOptionPaneTest proširuje JFrame (privatna static final long serialVersionUID = 1L; javni static final FONT= novi Font("Verdana", Font.PLAIN, 11); public static void createGUI() (JFrame frame = new JFrame("Test JOptionPane"); frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); frame.addWindowListener(new WindowListener() (javni void windowActivated(WindowEvent događaj) ()javno WindowEvent događaj) () public void windowDeactivated(WindowEvent događaj) () public void windowDeiconified(WindowEvent događaj) () public void windowIconified(WindowEvent događaj) () public void windowOpened(WindowEvent događaj) () public void windowClosing(WindowEvent događaj) (Object options = ( "Da", "Ne!" ); int rc = JOptionPane.showOptionDialog(event.getWindow(), "Zatvori prozor?", "Potvrdi", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, opcije, opcije) ; if (rc == 0) ( event.getWindow().setVisible(false); System.exit(0); ) ) )); JLabel label = new JLabel("Koristite prozirni panel prilikom zatvaranja prozora"); okvir. getContentPane().add(label);frame.setPreferredSize(nova dimenzija(350, 8 0)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); ) public static void main(String args) ( javax.swing.SwingUtilities.invokeLater(new Runnable() ( public void run()) ( UIManager.put("Button.font", FONT); UIManager.put("Label.font).font"). ", FONT); JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); createGUI(); ) )); ) )

Ako se metodi setDefaultCloseOperation preda konstanta JFrame.EXIT_ON_CLOSE, onda kada se prozor zatvori, aplikacija će prestati da radi. U primjeru, konstanta se prosljeđuje ovoj metodi JFrame.DO_NOTHING_ON_CLOSE tako da se ništa ne dešava kada je prozor zatvoren. Izlazak iz aplikacije u primjeru se vrši iz JFrame slušatelja WindowListener u metodi windowClosing. Kada se prozor zatvori, poziva se metoda windowClosing sa parametrom događaja WindowEvent, koji u prozirnom Swing JOptionPane otvara dijalog za potvrdu.

Sljedeći snimak ekrana prikazuje dva prozora aplikacije. Gornji glavni prozor. Zatvaranjem ovog prozora otvara se dijaloški okvir za potvrdu donje namjere.

JMenuBar Traka menija

Jedan od važne karakteristike upotreba JRootPane root okna u Swing-u je potreba da se postavi traka menija u prozor JMenuBar. Ozbiljna aplikacija se ne može napraviti bez neke vrste menija za pristup funkcijama programa. Swing biblioteka nudi odlične prilike da kreirate pogodne JMenuBar menije koji su takođe lagane komponente.

Traka menija JMenuBar postavljen u slojeviti panel u posebnom sloju FRAME_CONTENT_LAYER i zauzima mali prostor na vrhu prozora. Dužina trake menija jednaka je veličini prozora. Širina trake menija zavisi od komponenti koje sadrži.

Korijenski panel osigurava da panel sa sadržajem i traka menija JMenuBar nisu preklapali. Ako traka menija nije potrebna, tada korijenski panel koristi sav prostor za smještaj panela sa sadržajem.

Swing Examples

Izvorni kodovi primjera o kojima se govori u tekstu stranice mogu se preuzeti.

Upozorenje

Za razliku od prethodnih sesija, gdje smo u osnovi djelovali po principu „radi kao ja“ i govorili o konceptima i tehničkim detaljima u onome što se zove „na prste“, stil prezentacije, počevši od ove lekcije, će se donekle promijeniti i budi više tehnički.

To se, nažalost, ne može izbjeći, jer. prije ili kasnije morat ćemo doći do tačke, nakon koje pristup "na prstima" postaje neodrživ. Sada dolazi taj trenutak. Zato skupimo hrabrost, zasučimo rukave i krenimo.

U prethodnoj lekciji () smo formirali i prikazali grafički prozor na ekranu monitora i usput smo riješili neke probleme u vezi njegovog izgleda i lokacije. Sada ćemo razgovarati o tome šta je ostalo iza kulisa.

Vjerovatno ste primijetili da se na početku izvornog koda nalaze dvije sljedeće linije:

import java.awt.*;

import javax.swing.*;

Ovdje se trebamo malo zadržati. Podsjetimo da smo ranije spomenuli da okoliš Java programiranje uključuje mnoge biblioteke dizajnirane da podrže umrežavanje, grafiku, operacije baze podataka, razmjenu poruka itd. Biblioteke su ono što Javi daje svu moć i svestranost.

U Javi se umjesto termina "biblioteka" koristi koncept "paketa". Gornji redovi samo povezuju potrebne pakete da formiraju grafičko sučelje. Kasnije ćete vidjeti da ćemo koristiti i druge pakete, ali za sada su nam ova dva dovoljna.

Paketi uključuju potrebne klase i interfejse (o interfejsima ćemo kasnije) koji obezbeđuju jednu ili drugu funkcionalnost buduće aplikacije. Prisustvo zvjezdice ("*") označava da programer uvozi cijeli sadržaj paketa, bez tačna indikacija klase ili interfejse koje sadrži. Može se činiti da u slučaju velikih paketa rezultujući objektni kod može biti prevelik, ali ne brinite: Java kompajler je dovoljno "pametan" da koristi samo ono što vašem programu zaista treba; sve što programu nije potrebno, kompajler jednostavno neće uključiti u objektni kod. Ako želite, možete koristiti malo drugačiji oblik uključivanja paketa, na primjer,

import java.awt.window;

import javax.swing.JFrame;

ali ovo pretpostavlja da programer već dobro poznaje strukturu i mogućnosti ovih paketa. Koristićemo jednostavniji oblik povezivanja paketa koji je ranije naznačen.

Uvoz (povezivanje) paketa u program koji se razvija vrši se pomoću ključne riječi import, nakon čega ime ide paket. Svaki paket mora biti uvezen zasebno (tj. ne možete pisati import java.awt.*, javax.swing.*;). Naravno, volumen izvornog koda je nešto povećan, ali vrlo malo. Sve klase i interfejsi koji čine vaš program moraju biti postavljeni striktno nakon uvoznih konstrukcija, inače će kompajler generisati poruku o grešci kompilacije.

Prvi paket (koji počinje sa java.awt) prvenstveno obezbeđuje interakciju Java programa sa grafičkim podsistemom operativnog sistema. Podsjetimo da je Java programski jezik za više platformi i generiše jedan objektni kod bez obzira na operativni sistem na kojem će se taj kod izvršavati. Stoga je Java „prisiljena“ da pristupi resursima koje obezbeđuje operativni sistem koji je instaliran na računaru korisnika. Jedan od takvih resursa je grafika (osim grafike, Java poziva "usluge" operativnog sistema za pristup sistem podataka i drugi resursi). Dakle, paket java.awt.* dozvoljava grafičkim interfejsima napisanim u Javi da koriste grafičke mogućnosti operativnog sistema i da budu prikazani grafičkim objektima kreiranim u Javi. Java programi, na ekranu monitora. Ovdje ćemo se malo zadržati.

Sve grafičke komponente u Javi podijeljene su u dvije kategorije: lagane (lake) i teške (teške). Velika većina grafičkih komponenti (dugmad, liste, stabla, oznake, tabele, itd.) su lagane. To znači da operativni sistem ne zna apsolutno ništa o njima, pa čak ni ne "sumnja" na njihovo postojanje. Lagane komponente pripadaju prozorima (poput onog koji smo pokazali u prethodnoj lekciji) i prikazuju se u tim prozorima.

Ako želimo da prikažemo dugme u prozoru, samo ga trebamo definisati kodom kao što je sledeći

JButton buttonPressMe = new JButton("Pritisni me");

i postavite ga na navedenu lokaciju u prozoru (relevantni detalji će biti opisani kasnije). Dugme je lagani objekat i operativni sistem ne poznaje dugme (dugme ne postoji za operativni sistem). Za dugme "zna" samo prozor u kojem se nalazi. Prozor crta dugme, presreće događaje koji se dešavaju sa dugmetom, ponovo iscrtava dugme ako je bilo nečim zaklonjeno, itd. Ali sam prozor kao takav - operativni sistem je svjestan toga, i to upravo zato što je prozor teška komponenta. Samo prozor ima pristup resursima operativnog sistema (posebno grafičkim resursima).

Pogledajte izvorni kod. Kada smo izračunali koordinate gornjeg lijevog ugla prozora prije nego što smo ga prikazali na ekranu, trebali smo znati rezoluciju ekrana

Dimenzija sSize = Toolkit.getDefaultToolkit().getScreenSize()

Šta može pružiti takve informacije? Operativni sistem i samo on! Zatim smo koristili kod

try(UIManager.setLookAndFeel

(UIManager.getSystemLookAndFeelClassName());

uhvatiti (Exceptionlfe)()

tako da izgled prozora bude u skladu sa standardom usvojenim u određenom operativnom sistemu. Šta može pružiti takve informacije? Opet - operativni sistem! Dakle, za kreiranje grafičkih interfejsa, ne možemo bez paketa java.awt.*.

Kada se na ekranu prikaže prozor, operativni sistem dodeljuje potrebne resurse prozoru (prvenstveno memoriju) i prozor postaje vidljiv. Zatim u igru ​​dolaze lagane komponente i cjelina dalji rad obavlja gotovo isključivo s njima.

Drugi paket za uvoz (koji počinje sa javax.swing) je odgovoran za izgradnju lakih grafičkih interfejsa (postoje i drugi paketi, ali ovaj je najvažniji i skoro uvek se koristi). Ovaj paket ćemo učiti i savladavati postepeno, jer. prilično je velika i prilično složena. Ovo ćemo početi raditi u sljedećoj lekciji, ali za sada pogledajmo sljedeći red izvornog koda:

javna klasa MoneyForNothing proširuje JFrame(

Ovdje su nova dva elementa: ključna riječ extends i riječ JFrame.

Ključna riječ proširuje (prevedeno kao "proširiti", ali blizak po značenju riječi "nasljeđuje" ili frazi "posuditi svojstva i ponašanje") izražava temeljni koncept objektno orijentiranog programiranja (ili, jednostavnije, programiranja zasnovanog na klasama) . Ovaj koncept se naziva "naslijeđe". Ovo se mora dobro riješiti.

Zapamtite, u jednoj od prvih lekcija () raspravljali smo o konceptu klasa i koristili motor automobila kao primjer. Uz svu raznolikost motora i njihovih dizajna (naravno, govorimo o motorima s unutarnjim sagorijevanjem), gotovo svi ovi motori su slični jedni drugima: svaki od njih ima cilindre, klipove, radilice, ventile itd.

Naravno, ogroman dizel motor za tanker ne može se porediti sa sićušnim alkoholnim motorom za model aviona, ali oni su (ako mogu tako reći) - doduše daleki, ali rođaci. Imaju zajedničkog pretka - neku vrstu apstraktnog motora, a sami motori su njegovi potomci (čak i ako su vrlo, vrlo udaljeni).

U programiranju se takav predak obično naziva "roditelj" ili "superklasa", tj. klase iz koje potiču druge klase. Ime superklase dolazi direktno nakon proširenja. Dakle, preveden na običan jezik, gornji isječak koda može se čitati kao: "klasa... proširuje klasu JFrame", "klasa... nasljeđuje klasu JFrame", ili "klasa... posuđuje svojstva i ponašanje klasu JFrame". Klasa JFrame definira osnovna svojstva i ponašanje "standardnih" grafičkih prozora. Sama klasa JFrame nalazi se u paketu javax.swing.* i to je ono što smo uvezli na početku programa.

JFrame je roditelj (u Java terminologiji, superklasa) grafičkih prozora (postoje i drugi prozori, kao što su dijalozi, ali o njima ćemo kasnije). Ako se obratite Java dokumentaciji, vidjet ćete da klasa JFrame ima nekoliko konstruktora, polja i oko dvadesetak metoda koje definiraju ponašanje nekog "standardnog" prozora. Dakle, naša klasa pod nazivom MoneyForNothing je nasljednik klase JFrame (obično se ne govori o nasljednicima, već o potomcima ili podređenim klasama).

Imajte na umu da je sama klasa JFrame potomak nekoliko klasa (od kojih većina pripada već poznatom paketu java.awt.*):

Kako se ne bismo vraćali na ovo pitanje, skrećemo vam pažnju na činjenicu da se na vrhu hijerarhije nasljeđivanja Java nalaze klase iz paketa java.lang.*. Ovo je jedini paket iz JDK-a koji ne mora biti eksplicitno uvezen - uvijek se automatski uvozi. Sudeći po ovoj "ljestvici", klasa JFrame je pra-pra-pra-praunuk java.lang.Object (slika iznad se naučno naziva hijerarhijom klasa).

Sve komponente grafičkog korisničkog interfejsa (skraćeno GUI, od Graphical User Interface), koje su, podsetimo, lagani elementi, moraju biti smeštene unutar glavnog prozora - naslednika JFrame-a. Trenutno nemamo komponente, ali će se uskoro pojaviti - obećavamo.

A sada idemo preko našeg posljednjeg izvorni kod, koji izgleda ovako:

// Constructor

javni novac za ništa()(

setTitle("Dobrodošli u novac za ništa");

setSize(nova dimenzija(600, 400));

Dimenzija sSize = Toolkit.getDefaultToolkit().getScreenSize(),

fSize = getSize();

if (fSize.height > sSize.height) (fSize.height = sSize.height;)

if (fSize.width > sSize.width) (fSize.width = sSize.width;)

setLocation((sSize.width - fSize.width)/2,

(sSize.height - fSize.height)/2);

setDefaultCloseOperation(EXIT_ON_CLOSE);

setVisible(true);

Prije svega, postavljamo naslov prozora (metoda setTitle(...)). Zatim se postavljaju horizontalne i vertikalne dimenzije prozora (metoda setSize(...)). Nakon određivanja rezolucije ekrana monitora, izračunavaju se koordinate gornjeg lijevog ugla našeg prozora i prozor se prikazuje (metod setLocation (...)) na navedenoj lokaciji na ekranu.

Nakon toga određujemo šta da radimo prilikom zatvaranja prozora u sistemskom meniju; u ovom slučaju, jasno je da aplikacija treba da prekine svoj rad (EXIT_ON_CLOSE). Iza ove kratke i jednostavne linije zapravo je iznenađujuće zanimljiv i intrigantan svijet upravljanja događajima. Recimo odmah: razumijevanje mehanizma rukovanja događajima u Javi je ključni momenat u razvoju grafičkih aplikacija, a počevši od sljedeće lekcije, radit ćemo upravo to.

Konačno, posljednji red (metod setVisible(true)) čini prozor vidljivim.

Naravno, nismo izostavili neke detalje, ali nam nije cilj da detaljno ispričamo sve i svašta – za to postoji dokumentacija, priručnik i tutorijali. Naš cilj je dati opći smjer, polaznu tačku, počevši od koje ćete (ako želite i uz dovoljno upornosti) moći razvijati svoje programe u pravim smjerovima i ispuniti ih potrebnom funkcionalnošću.

Ovim je naša lekcija završena. Najvažnija stvar koju treba oduzeti od toga je koncept nasljeđivanja (zaduživanja). Ovo je zaista fundamentalni koncept. Bez toga, u Javi je nemoguće stvoriti bilo kakav kompleks i koristan program, zato uzmite si vremena da krenete dalje, ali još jednom pažljivo pregledajte i razmotrite sve što smo do sada naučili.

Sretno i vidimo se uskoro!

U ovom kratkom članku želim opisati proces kreiranja mali program podržava GUI u jeziku Java. Pretpostavlja se da je čitalac upoznat sa osnovama jezika. Java.

I tako, koji nam alati trebaju:

  • Java virtuelna mašina (OpenJDK ili Oracle JDK)
  • Intellij IDEA (ili drugi IDE za Javu)

Nakon instalacije potreban softver, otvoren IntelliJ IDEA i kreirajte novi projekat: File -> New Project…

Dao sam naziv projektu guiBase. Kao što možete vidjeti na snimku ekrana, folder src ne sadrži ništa, pa u njemu kreiramo našu glavnu klasu koja sadrži funkciju main.

Javna klasa Main (javni statički void main(String args) (System.out.println("Zdravo, Govzala!"); ))

Pogledajte sadržaj glavne klase iznad. Sada možemo kreirati projekat ( projekat izgradnje ) i pokrenite ga ( Trči ). Dolje u terminalu vašeg IDE vidjet ćete poruku Zdravo, Govzala!. Ali kao što ste i sami shvatili - ne podržava GUI.

On ovoj fazi već imamo radni program, ali bez GUI podrške. A sada u istom folderu src stvoriti GUI Forma: Novo -> GUI obrazac

Otvorite kreirani GUI obrazac, kliknite na jPanel i postavite njegov identifikator u polje naziv polja, Pitao sam panel.

Zatim prevucite i ispustite na obrazac sa desne strane JTextField, JPasswordField I jButton:

Ostaje dodati kod i povezati naš obrazac s njim. Kada smo dodali obrazac glavni prozor, klasa je automatski kreirana glavni prozor, ova klasa je klasa generiranog oblika, tj. ova klasa će služiti svim događajima datog oblika.

Iako naša klasa prozora sadrži neophodni elementi, ali čak i sada to nema nikakve veze sa GUI, pa hajde da ga proširimo sa jFrame i naslijediti svu osnovnu i potrebnu funkcionalnost GUI .

IN ovog trenutka imamo formu glavni prozor i klasa glavni prozor produžen sa jFrame. Sada moramo definirati sve dodane GUI elemente kao sadržaj klase glavni prozor this.getContentPane().add(panel); Nakon toga, sadržaj datoteke MainWindow.java će se promijeniti na sljedeći način:

Uvezi javax.swing.*; javna klasa MainWindow proširuje JFrame (privatno JTextField textField1; privatno JPasswordField passwordField1; privatno dugme JButton1; privatni JPanel panel; javni MainWindow() ( this.getContentPane().add(panel); ) )

Ako pokušate pokrenuti kod, ponovo ćete vidjeti istu poruku „Zdravo, Govzala!“. Stvar je u tome što smo kreirali klasu i formu za nju, ali nismo kreirali instancu ove klase.

Vrijeme je da promijenite datoteku Main.java i tamo dodate kod za kreiranje našeg GUI-a:

Uvezi java.awt.*; javna klasa Main ( public static void main(String args) ( // Kreirajte instancu MainWindow klase MainWindow mainWindow = new MainWindow(); // Pakirajte sve elemente iz našeg obrasca mainWindow.pack(); // Promijenite veličinu prozora mainWindow.setSize( new Dimension(200, 200)); // Prikaz kreiranog prozora mainWindow. setVisible(true); ) )

Pokretanje koda

Klikom na dugme primetićete da program ni na koji način ne reaguje. Stvar je u tome što još nismo dodali slušaoca ( Slušalac) za događaje ( Događaji) dugmeta.

slušalac događaja ( slušalac događaja) jButton mora biti implementacija adaptera ActionListener, pa dodajte sljedeći kod u tijelo klase glavni prozor:

Privatna klasa MyButtonListener implementira ActionListener ( @Override public void actionPerformed(ActionEvent actionEvent) ( ) )

Metoda actionPerformed() će rukovati svim događajima dugmeta button1, ali prvo morate da kažete button1 koju će klasu rukovati, pa dodajte sledeći kod u konstruktor klase MainWindow: this.button1.addActionListener(new MyButtonListener()); Kako naš rukovatelj ne bi bio besmislen, dodajte sljedeći kod metodi actionPerformed():

@Override public void actionPerformed(ActionEvent actionEvent) ( if (textField1.getText().equals(passwordField1.getText())) ( JOptionPane.showMessageDialog(null, "Uspjeh"); ) else ( JOptionPane.showMessageDiaF "); ) )

Sada će program ispravno reagovati na događaje, naravno ne na sve događaje. Na primjer, ako pokušate da onemogućite program klikom na križić, prozor će nestati, ali će program i dalje raditi, jer. Rukovalac događaja glavnog prozora nije dodan.

Pošaljite svoj dobar rad u bazu znanja je jednostavno. Koristite obrazac ispod

Studenti, postdiplomci, mladi naučnici koji koriste bazu znanja u svom studiranju i radu biće vam veoma zahvalni.

Objavljeno na http://www.allbest.ru/

UVOD

Tokom proteklih nekoliko godina, programeri su uložili mnogo truda u integraciju grafike i animacije u svoje aplete i Java aplikacije. Koristeći java.awt i javax.swing API-je, programeri mogu implementirati mnogo složenije grafičke aplikacije, uključujući igre, screensaver, screensaver i 3D grafiku. korisnički interfejs.

Svrha rada Obračunski i grafički rad posvećen je izgradnji aplikacija korišćenjem grafičkog interfejsa biblioteka java.awt i javax.swing.

Relevantnost Do danas, grafika je od velikog značaja za programske jezike. Omogućava vam da vizualizirate bilo koji program, što daje svjetlinu i pogodnost za korištenje određenih programa. Omogućava vam da kreirate svijetle i zanimljive web stranice, pogodan je za razvoj baza podataka, pisanje mobilnih i kompjuterskih igrica.

1. FORMULACIJA PROBLEMA

Grafički korisnički interfejs (GUI) je glavni način na koji krajnji korisnici komuniciraju sa java aplikacijom. Za razvoj primijenjenih softver u jeziku Java, odnosno grafičkom interfejsu aplikacija, obično se koriste paketi AWT i Swing.

AWT (paket java.awt se preuzima za pristup) sadrži skup klasa koje vam omogućavaju da izvodite grafičke operacije i kreirate kontrole prozora, slično kao što se to radi u VBA i Delphiju;

Swing (paket javax.swing se učitava za pristup) sadrži nove klase, uglavnom slične AWT. J se dodaje nazivima klasa (JButton, JLabel, itd.).

Trenutno su glavne klase za izgradnju vizuelnih interfejsa sadržane u Swing paketu. Iz AWT paketa, klase se koriste za obradu poruka. Protozoa grafička aplikacija ispod.

import javax. swing.*;

javna završna klasa HelloWorld implementira Runnable(

public static void main (String args) (

//Swing ima svoju nit za slanje,

//koji radi paralelno s glavnim (u kojem se izvršava main())

//potok. Ako se glavna nit završi (glavna metoda se završi),

//nit odgovorna za rad Swing interfejsa može nastaviti svoj rad.

//A čak i ako je korisnik zatvorio sve prozore, program će nastaviti svoj rad

//(sve dok je ova nit živa). Od Jave 6 kada je sve

//komponente su uništene, kontrolni tok se automatski zaustavlja.

//Pokreni sav kod koji se izvodi na kontrolnoj niti, čak i inicijalizaciju:

SwingUtilities.invokeLater(new HelloWorld());

public void run() (

// Kreirajte prozor sa naslovom "Hello, World!"

Okvir f = novi JFrame("Hello, World!");

// Prethodna praksa je bila kreiranje slušaoca i registracija

// na instanci glavnog prozora koja je odgovorila na windowClosing()

// prisilno zaustavljanje virtuelna mašina pozivanjem System.exit()

// Sada postoji "ispravniji" način za postavljanje reakcije na zatvaranje prozora.

// Ova metoda uništava trenutni prozor, ali ne zaustavlja aplikaciju. Tem

// sama aplikacija će raditi dok se svi prozori ne zatvore.

f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

// međutim, možete ga postaviti i ovako:

// f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Dodajte komponentu koja se ne može uređivati ​​s tekstom na panel prozora.

// f.getContentPane().add (new JLabel("Hello, World!")); - stari stil

f.add(novi JLabel("Hello World"));

// pack() "pakuje" prozor do optimalne veličine

// sve komponente koje se nalaze u njemu.

// Prikaži prozor

f.setVisible(true);

Swing pruža mehanizme za kontrolu sljedećih aspekata prezentacije:

Tastatura (Swing pruža način za presretanje korisničkog unosa)

Boje (Swing pruža način da promijenite boje koje vidite na ekranu)

Tekstualno polje za unos (Swing obezbeđuje tekstualne komponente za rukovanje svim svakodnevnim zadacima).

JComponent

Osnovna klasa cijele Swing biblioteke vizualnih komponenti je JComponent. To je superklasa drugih vizuelnih komponenti. To je apstraktna klasa, tako da zapravo ne možete kreirati JComponent, ali sadrži stotine funkcija koje svaka komponenta Swing može koristiti kao rezultat hijerarhije klasa. Klasa JComponent obezbeđuje infrastrukturu za bojenje za sve komponente, zna kako da rukuje svim pritiskom na tastere na tastaturi, stoga njene podklase treba da slušaju samo određene tastere. Klasa JComponent također sadrži metodu add() koja vam omogućava da dodate druge objekte klase JComponent, tako da možete dodati bilo koju komponentu Swing bilo kojoj drugoj da biste kreirali ugniježđene komponente (na primjer, JPanel koji sadrži JButton, ili čak elegantnije kombinacije , kao što je JMenu koji sadrži JButton ).

JLabel

Najjednostavnija i istovremeno glavna vizuelna komponenta u Swing biblioteci je JLabel, ili "oznaka". Metode ove klase uključuju postavljanje teksta, slike, poravnanja i drugih komponenti koje oznaka opisuje:

get/setText() - dobiti/postaviti tekst u etiketi;

get/setIcon() - dobiti/postaviti ikonu u etiketi;

get/setHorizontalAlignment - dobiti/postaviti horizontalnu poziciju teksta;

get/setDisplayedMnemonic() - get/set mnemonika (podvučeni karakter) za oznaku;

get/setLabelFor() - get/set komponentu na koju je ova oznaka pričvršćena; kada korisnik pritisne kombinaciju tastera Alt + mnemonika, fokus se pomera na navedenu komponentu.

jButton

Glavna aktivna komponenta u Swingu je Jbutton.

Metode koje se koriste za promjenu svojstava JButton-a su slične onima kod JLabel-a (vidjet ćete da su iste za većinu Swing komponenti). Oni kontroliraju tekst, slike i orijentaciju:

get/setText() - dobiti/postaviti tekst u dugmetu;

get/setIcon() - dobiti/postaviti sliku u dugmetu;

get/setHorizontalAlignment() - dobiti/postaviti horizontalnu poziciju teksta;

get/setVerticalAlignment() - dobijanje/podešavanje vertikalne pozicije teksta;

get/setDisplayedMnenomic() - get/set mnemonika (podvučeni karakter) koji, u kombinaciji sa dugmetom Alt, uzrokuje da se klikne na dugme.

jFrame

Klasa JFrame je kontejner koji vam omogućava da dodate druge komponente sebi kako biste ih organizirali i predstavili korisniku.

JFrame djeluje kao most između Swing dijelova nezavisnih od operativnog sistema i stvarnog operativnog sistema na kojem rade. JFrame je registrovan kao prozor i na taj način prima mnoga svojstva prozora operativnog sistema: minimizaciju/maksimizaciju, promjenu veličine i kretanje. Iako implementacija laboratorijski rad dovoljno je zamisliti JFrame kao paletu na koju postavljate komponente. Evo nekih od metoda koje možete pozvati na JFrame-u da promijenite njegova svojstva:

get/setTitle() - dobiti/postaviti naslov okvira;

get/setState() - dobiti/postaviti stanje okvira (minimizirati, maksimizirati, itd.);

is/setVisible() - dobijanje/podešavanje vidljivosti okvira, drugim rečima, prikaza na ekranu;

get/setLocation() - dobiti/postaviti lokaciju u prozoru na kojoj treba da se pojavi okvir;

get/setSize() - get/set size frame;

add() - dodaje komponente u okvir.

Šeme, modeli i događaji

Kada pravite vizuelne aplikacije u Javi, ne možete ih samo nasumično postaviti na ekran i očekivati ​​da rade odmah. Komponente treba postaviti na određene lokacije, reagirati na interakcije s njima, ažurirati ih na osnovu te interakcije i popuniti ih podacima. Za efikasan rad sa vizuelnim komponentama, sledeće tri Swing arhitektonske komponente moraju biti instalirane.

Šeme (izgled). Swing sadrži mnoge šeme, koje su klase koje kontroliraju gdje se komponente postavljaju u aplikaciju i šta bi im se trebalo dogoditi kada se promijeni veličina prozora aplikacije ili kada se komponente uklone ili dodaju.

Događaji Program mora da reaguje na pritiske tastera, klikove mišem i sve ostalo što korisnik može da uradi.

Modeli (model). Za naprednije komponente (liste, tabele, stabla) pa čak i neke jednostavnije kao što je JComboBox, modeli su najviše efikasan metod rad sa podacima. Oni uklanjaju veći dio posla obrade podataka iz same komponente (mislim na MVC) i pružaju omotač oko uobičajenih klasa objekata podataka (kao što su Vector i ArrayList).

Zbog potrebe prikazivanja dinamičkih scena na vizuelnim komponentama, posebnu pažnju treba obratiti na klasu Grafika 2D.

Individualni zadatak proračuna i grafičkog rada: Nacrtati u prozoru aplikacije segment koji rotira u ravni okvira oko tačke koja se kreće duž segmenta.

GUI java komponenta

2. IMPLEMENTACIJA PROBLEMA NA VISOKOM JEZIKUJAVA

import java.awt.*;

import java.awt.geom.*;

import java.awt.image.BufferedImage;

* Zadatak 4. oslikati V prozor aplikacije (applet) linijski segment, rotirajući V

* avion okvir okolo bodova kreće se By segment.

javna klasa LB4 proširuje java.applet.Applet implementira Runnable(

privatni statički final long serialVersionUID= 1L;

privatni int w, h;

private BufferedImage bi;

privatni Graphics2D veliki;

privatni logički stop = lažno;

private Thread timer = null;

privatno Boja fonColor = Boja. BIJELA;

privatni segment bojeBoja = Boja. SVIJETLO SIVA;

private Color pointColor = Boja. ZELENI;

privatni segment;

// početni lokacija crtanje

privatni dupli segment dužine;

// smjer pristrasnost sjekire rotacija

privatni dvostruki movePoint = -1;

privatna dvostruka smjena = 0;

privatni dvostruki speedPoint = 1;

// brzina promjene odredbe V prostor

private int speedRepaint = 30;

// ugao on koji ide promjene odredbe segment

privatni int grad = 15;

/** Ovo metoda će pozvao poslije preuzimanja applet */

public void init()(

// Mi stvaramo objekata I instalirati početni vrijednosti.

Dimenzija dim = getSize();

// Mi stvaramo segment, pitam dužina

dužinaSegment = (dvostruki) Math. min(š, v) / 3;

segment = novi segment(lengthSegment, lengthSegment / 2, grad,

segmentColor, pointColor, fonColor);

bi = (BufferedImage) createImage(w, h);

big = bi.createGraphics();

big.setRenderingHint(RenderingHints. KEY_ANTIALIASING,

RenderingHints. VALUE_ANTIALIAS_ON);

// Mi stvaramo protok, koji će periodično poziv metoda ažurirati.

tajmer = nova nit(ovo);

) uhvatiti (izuzetak e) (

Sistem. van.println(e);

) // kraj u tome

// Ovo metoda izvodi precrtavanje prozor applet

javno ažuriranje nevažećih (Grafika g) (

// Dobijamo pokazivač on objekat Graphics2D

Grafika2D g2 = (Grafika2D) g;

// Crtamo završeno slika on ekran

g2.drawImage(bi, 0, 0, ovo);

) catch (greška izuzetka) (

Sistem. van.println(error.getMessage());

privatni void grawSegment() (

* //Čišćenje crtanje big.setBackground(Color.BLUE); big.clearRect(0, 0,

// Crtamo linijski segment

shift += movePoint * speedPoint;

ako (smjena< -lengthSegment / 2) {

movePoint *= -1;

pomak = -lengthSegment / 2;

) else if (shift > lengthSegment / 2) (

movePoint *= -1;

pomak = dužinaSegment / 2;

segment.setPos(shift, speedPoint);

segment.rotate();

big.drawImage(segment.getSegment(), null, 0, 0);

// Ovo metoda izvedeno V odvojeno protok(tajmer).

// On uzroci precrtavanje prozor applet svaki daj mi sekund.

public void run() (

thread. currentThread();

thread. spavaj(speedRepaint);

) uhvatiti (greška izuzetka) (

// Ovo metoda izvedeno Ako korisnik lijevo stranica

// With applet. On zaustavlja protok(tajmer) i, respektivno,

// precrtavanje prozor applet.

javna praznina stop()(

// Ova metoda se izvršava kada korisnik dođe na stranicu

// sa apletom. Pokreće paralelnu nit (tajmer).

public void start() (

if (tajmer == null) (

tajmer = nova nit(ovo);

// Ova metoda se izvršava kada je stranica koja sadrži aplet zatvorena.

public void destroy() (

super.destroy();

thread. currentThread();

// Pričekajte da se paralelna nit (tajmer) završi.

thread. prinos();

) // kraj uništiti

) // završiti javnu klasu RotatingSegment

// kreiranje segmenta

privatni statički dupli x = 0;

konačni dupli RAD = 10;

privatna dvostruka dužina;

privatni segment BufferedImage;

privatni ColorsegmentColor;

private Color pointColor;

privatno Boja backgroundColor;

privatni Rectangle2D.Double r;

privatni Ellipse2D.Double p;

privatna dvostruka osa rotacije;

privatni Point2D.Double centar;

privatna dvostruka smjena;

// kut za koji se mijenja pozicija segmenta

privatni intgrad;

Segment (dvostruka dužina, dvostruka posPoint Rotating, int grad,

Segment boja Boja, Boja tačkaBoja, Boja pozadine Boja pozadine)

baca izuzetak(

// provjeravamo parametre

ako (dužina<= 0 || posPointRotating < 0 || length < posPointRotating)

baci novi izuzetak(

"Greška: nevažeći parametar u segmentu klase");

this.grad = grad;

this.segmentColor = segmentColor;

this.pointColor = pointColor;

this.backGroundColor = backGroundColor;

this.length = dužina;

// kreiranje crteža

segment = nova BufferedImage((int) dužina * 3, (int) dužina * 3,

BufferedImage. TYPE_INT_ARGB);

centar = nova Point2D.Double(dužina, 3 * dužina / 2);

// kreiranje segmenta

os rotacije = centar.x + posPointRotiranje - RAD / 2;

p = novi Ellipse2D.Double (rotacija osa, centar.y, RAD, RAD);

// postavlja boju segmenta

g2.setColor(segmentColor);

// nacrtati segment

// postavljanje boje

g2.setColor(pointColor);

// nacrtati tačku

// pomiče tačku stožera

public void setPos(double shiftX, double shiftY) (

// kreiranje segmenta

this.shift = shiftX;

center.y = center.y + shiftY * Math. grijeh(Matematika. to Radians(grad * x));

r = novi Rectangle2D.Double(center.x, center.y, length, RAD);

p = novi Ellipse2D.Double (rotacijaAxis + shift, center.y, RAD, RAD);

// rotira segment

javna void rotate()(

AffineTransform at = AffineTransform. getRotateInstance(

Math. to Radians(grad * (++ x)), os rotacije + RAD / 2 + pomak,

// dobijemo grafički kontekst

Graphics2D g2 = segment.createGraphics();

// bojimo sve datom bojom

g2.setBackground(backGroundColor);

g2.clearRect(0, 0, (int) (3 * dužina), (int) (3 * dužina));

g2.setTransform(at);

g2.setColor(segmentColor);

// nacrtati segment

// postavljanje boje

g2.setColor(pointColor);

// nacrtati tačku

// Vraća sliku

public BufferedImage getSegment() (

3. PRIMJER RADA PROGRAMA

Rezultat izvođenja programa:

Slika 1. Rezultat izvršavanja programa

Slika 2. Rezultat izvršavanja programa

Slika 3. Rezultat izvođenja programa

ZAKLJUČAK

Ovim je završena naša rasprava o grafici u Javi. U ovom radu dali smo kratak pregled alata za programiranje 2D grafike u Javi. Predstavili smo aplikaciju koja pokazuje upotrebu geometrijskih oblika, tekstura.

Raspravljali smo o nekim grafičkim karakteristikama Jave. Počeli smo sa kratkim uvodom u osnove grafike, kao što su koordinatni sistemi i grafički konteksti. Zatim smo razgovarali o Java 2D objektima. Također smo ukratko pokrili kako koristiti grafičke efekte.

Druga polovina našeg uvoda u grafičko programiranje u Javi. Koristeći grafički interfejs biblioteka java.awt i javax.swing, kreirali smo jednostavan grafički editor koji rotira dvodimenzionalni objekat oko svoje ose.

BIBLIOGRAFIJA

1. H. M. Deitel, P.J. Deitel, S.I. Suntry - Java programske tehnologije, knjiga 1 (grafika, JAVABEANS, korisnički interfejs)

2. Judy Bishop - Efikasno radi na Javi

3. James Gosling, Bill Joy, Guy Steele, Gilad Bracha - Specifikacija jezika Java, drugo izdanje.

4. Tim Lindholm, Frank Yellin - Specifikacija Java virtuelne mašine, drugo izdanje.

5. Gosling J., Arnold K. - Java programski jezik

6. Informacije sa www.ibm.com

7. Informacije sa sajta www.mexmat.sgu.ru

8. Informacije sa sajta www.uic.rsu.ru

Hostirano na Allbest.ru

...

Slični dokumenti

    Organizaciona struktura GUI, deklarisanje i kreiranje slušalaca događaja koristeći anonimne klase. Reprezentacija podataka za tabelu je klasa AbstractTableModel. Vizualizacija ćelija tabele. Dva glavna tipa I/O tokova u Javi.

    predavanje, dodato 01.05.2014

    Razvoj grafičkog uređivača za crtanje dvodimenzionalne i trodimenzionalne grafike koristeći programski jezik Java i Java 2D i Java 3D aplikacijski programski interfejs. Kreiranje grafičkog uređivača 3D Paint. Glavne metode klase Grafika.

    seminarski rad, dodan 19.11.2009

    Opis paketa aplikacije Net Beans 8.1. Razvoj korisničkog interfejsa apleta. Kreiranje okvira prozora na osnovu okvira java.swing biblioteke. Promijenite boju tekstualnih podataka. Dizajniranje i kreiranje infološkog modela apleta.

    kontrolni rad, dodano 11.07.2016

    Mrežne mogućnosti programskih jezika. Prednosti korištenja Java apleta. Klase uključene u biblioteku java.awt. Kreiranje korisničkog interfejsa. Povezivanje utičnice sa serverom. Grafika u Javi. Vrijednosti komponenti boje.

    seminarski rad, dodan 10.11.2014

    Java Foundation Classes, osnovni koncepti. Originalna hijerarhija klasa Abstract Window Toolkit-a. Predstavnici korisničkog interfejsa. Rukovanje događajima u JavaBeans-u. Kontrole, JText višelinijsko polje. Listing programa TextEditor.

    seminarski rad, dodan 26.06.2013

    Izvođenje Java programa. Skup JDK programa i klasa. Objektno orijentirano programiranje u Javi. Principi izgradnje grafičkog interfejsa. Komponenta i kontejner grafičkog sistema. Apleti su programi koji se pokreću u okruženju pretraživača.

    seminarski rad, dodan 08.02.2011

    Aplikacioni dijagram konzole za tabeliranje funkcija. Razlika između konzolne aplikacije i aplikacije i GUI. Dijagram klasa za JFrame i JPanel. Kreiranje jednostavnog okvira u Javi. Raspored elemenata interfejsa unutar okvira. Petlja događaja.

    predavanje, dodato 01.05.2014

    Pojam i opšte karakteristike PHP programskog jezika, principi i faze njegovog rada, sintaksa i pripadajući nizovi. Rukovanje izuzecima u Javi. Rad sa bazama podataka koristeći JDBC. Naučite kako da razvijete grafički interfejs.

    prezentacija, dodano 13.06.2014

    Razvoj logičke šeme za bazu podataka preduzeća za proizvodnju automobila. Modeliranje infološkog sistema. Kreiranje grafičkog korisničkog interfejsa za bazu podataka koristeći programski jezik Java. Testiranje softvera.

    seminarski rad, dodan 16.12.2013

    Kreiranje konzolnih aplikacija pomoću grafičkog korisničkog interfejsa. Sadržaj palete komponenti programa C++ Builder. Koristeći mogućnosti objektno orijentisanog programiranja, karakteristike uređivača koda i forme u C ++.



Učitavanje...
Top