Proces vývoja jednoduchého GUI programu v Jave. Vytvorenie Java GUI Vytvorenie Java GUI aplikácie

Grafické rozhranie v Jave prešlo veľmi tŕnistou cestou vývoja a formovania. Dlho bol obviňovaný z pomalej práce, chamtivosti po systémových zdrojoch a obmedzenej funkčnosti.

Java AWT

Sunov prvý pokus o stvorenie GUI existovala knižnica pre java A.W.T.(Abstract Window Toolkit) – súprava nástrojov na prácu s rôznymi prostrediami okien. Sun vytvoril vrstvu Java, ktorá volá metódy z knižníc napísaných v C. Metódy knižnice AWT vytvárajú a používajú grafické komponenty operačného prostredia. Na jednej strane je to dobré, pretože program Java je podobný iným programom v rámci rovnakého operačného systému. Ale keď ho spustíte na inej platforme, môžu existovať rozdiely vo veľkostiach komponentov a fontov, ktoré pokazia vzhľad programu.

Pre zaistenie multiplatformovosti A.W.T. rozhrania volania komponentov boli zjednotené, čo má za následok mierne zníženú funkčnosť. A súbor komponentov sa ukázal byť dosť malý. Napríklad v AWT nie sú žiadne tabuľky a ikony nie sú podporované v tlačidlách. Avšak balík java.awt je súčasťou Java od prvého vydania a dá sa použiť na vytváranie GUI.

Takže komponenty A.W.T. nerob žiadnu "prácu". Je to len "obal Java" pre ovládacie prvky operačný systém na ktorých pracujú. Všetky požiadavky na tieto komponenty sú presmerované na operačný systém, ktorý vykonáva všetku prácu.

Použité zdroje A.W.T. sa pokúša uvoľniť automaticky. To mierne komplikuje architektúru a ovplyvňuje výkon. Napísať niečo vážne pomocou AWT bude trochu ťažké. Teraz sa používa iba pre applety.

Základné koncepty SWING

Po A.W.T. Sun vyvinul knižnicu grafických komponentov Hojdačka, napísaný celý v Jave. Na vykresľovanie sa používa 2D, čo so sebou prináša hneď niekoľko výhod. Súbor štandardných komponentov ďaleko prevyšuje AWT z hľadiska rozmanitosti a funkčnosti. Swing uľahčuje vytváranie nových komponentov dedením od existujúcich a podporuje rôzne štýly a vzhľady.

Tvorcovia novej knižnice používateľského rozhrania Hojdačka„nevynašli koleso“ a ako základ svojej knižnice si vybrali AWT. Samozrejme, nehovorili sme o použití špecifických ťažkých komponentov AWT (reprezentovaných triedami Button, Label a podobne). Iba ľahké komponenty poskytovali požadovanú mieru flexibility a ovládateľnosti. Diagram dedičstva ukazuje vzťah medzi AWT a Swing.

Najdôležitejší rozdiel Hojdačka od AWT je, že komponenty Swing nie sú vôbec spojené s operačným systémom a sú teda oveľa stabilnejšie a rýchlejšie. Takéto komponenty sa v jazyku Java nazývajú odľahčené a pochopenie základných princípov ich fungovania bude dlhou cestou k vysvetleniu, ako funguje Swing.

Swing kontajnery najvyššej úrovne

Ak chcete vytvoriť grafické rozhranie aplikácie, musíte použiť špeciálne komponenty knižnice Swing, nazývané kontajnery najvyššej úrovne. Sú to okná operačného systému, ktoré sú hostiteľmi komponentov používateľského rozhrania. Kontajnery najvyššej úrovne zahŕňajú okná JFrame a JWindow, dialógové okno JDialog a aplet JApplet (ktorý nie je oknom, ale je určený aj na zobrazenie rozhrania v prehliadači, v ktorom je spustený tento aplet). Kontajnery Swing najvyššej úrovne sú ťažké komponenty a sú výnimkou zo všeobecného pravidla. Všetky ostatné komponenty Swing sú ľahké.

Jednoduché Hojdačka príklad rozhrania okna jFrame.

Importovať java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JLabel; public class JFrameTest ( public static void createGUI() ( JFrame frame = new JFrame("Testovací rámec"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label = new JLabel("Testovací štítok"); 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() ( public void run() ( createGUI(); ) )); ) )

Konštruktér JFrame() bez parametrov vytvorí prázdne okno. Konštruktér JFrame (názov reťazca) vytvorí prázdne okno s nadpisom. Na vytvorenie najjednoduchší program s prázdnym oknom je potrebné použiť nasledujúce metódy:

  • setSize(int width, int height) - definovanie veľkosti okna;
  • setDefaultCloseOperation(int operation) - definícia akcie pri ukončení programu;
  • setVisible (viditeľné booleovské) - zviditeľní okno.

Ak nedefinujete veľkosť okna, potom bude mať nulovú výšku bez ohľadu na to, čo je v ňom. Rozmery okna zahŕňajú nielen „pracovnú“ plochu, ale aj okraje a titulok.

Metóda setDefaultCloseOperation definuje akciu, ktorá sa má vykonať pri „ukončení programu“. Ak to chcete urobiť, odovzdajte konštantu EXIT_ON_CLOSE opísanú v triede JFrame ako parameter operácie.

Štandardne je okno vytvorené neviditeľné. Na zobrazenie okna na obrazovke sa volá metóda setVisible s parametrom true. Ak ho zavoláte s parametrom false, okno sa stane neviditeľným.

GUI java hojdačka príklad vytvorenia okna jFrame znázornené na nasledujúcom obrázku.

Na pripojenie knižnice Hojdačka aplikácia potrebuje importovať knižnicu javax.hojdačka.

Zakaždým, keď sa vytvorí kontajner najvyššej úrovne, či už ide o normálne okno, dialógové okno alebo applet, konštruktor kontajnera vytvorí Koreňový panel JRootPane. Kontajnery Swing najvyššej úrovne zaisťujú, že iné komponenty sa nemôžu „plaziť“ mimo JRootPane.

Koreň bledý JRootPane dodáva kontajnerom vlastnosť "hĺbka", ktorá poskytuje možnosť nielen umiestniť komponenty nad seba, ale v prípade potreby ich aj zameniť, zväčšiť alebo zmenšiť hĺbku komponentov. Táto funkcia je potrebná pri vytváraní aplikácie s viacerými dokumentmi. Hojdačka, ktorého okná predstavujú odľahčené komponenty naukladané na sebe, ako aj rozbaľovacie (kontextové) ponuky a popisky.

Nasledujúci obrázok jasne ukazuje štruktúru koreňového panela JRootPane.

Koreňový panel JRootPane je kontajner, ktorý dedí zo základnej triedy Swing JComponent. V tomto kontajneri je za rozloženie komponentov zodpovedný špeciálny správca rozloženia, implementovaný v internej triede RootPaneLayout. Tento správca rozloženia je zodpovedný za zabezpečenie toho, aby všetky súčasti koreňového panelu boli umiestnené tak, ako by mali byť: vrstvený panel zaberá celý priestor okna; jeho FRAME_CONTENT_LAYER obsahuje panel s ponukami a panel obsahu a nad tým všetkým je priehľadný panel.

Všetky komponenty koreňového panela JRootPane možno získať alebo zmeniť. Má na to sadu metód get/set. Programovo JRootPane možno získať pomocou metódy getRootPane().

Okrem kontajnerov najvyššej úrovne sa koreňový panel používa v interných oknách JInternalFrame vytvorených v aplikáciách s viacerými dokumentmi a umiestnených na „desktope“ JDesktopPane. To vám umožní zabudnúť na to, že tieto okná sú obyčajné ľahké komponenty a pracovať s nimi, ako keby to boli skutočné kontajnery najvyššej úrovne.

Vrstvený panel JLayeredPane

Na základni koreňového panelu (kontajnera) leží takzvaný vrstvený panel JLayeredPane A, ktoré zaberá všetok dostupný priestor v kontajneri. Práve v tomto paneli sú umiestnené všetky ostatné časti koreňového panela vrátane všetkých komponentov používateľského rozhrania.

JLayeredPane používa sa na pridanie vlastnosti hĺbky do kontajnera. To znamená, že viacvrstvový panel vám umožňuje usporiadať v kontajneri tretí rozmer, pozdĺž ktorého sú umiestnené vrstvy (vrstvy) komponentu. V bežnom kontajneri je umiestnenie komponentu určené obdĺžnikom, ktorý ukazuje, akú veľkú časť kontajnera komponent zaberá. Pri pridávaní komponentu do viacvrstvového panelu musíte určiť nielen obdĺžnik, ktorý komponent zaberá, ale aj vrstvu, v ktorej sa bude nachádzať. Vrstva vo vrstvenom paneli je definovaná celým číslom. Čím väčšie číslo definuje vrstvu, tým vyššia je vrstva.

Prvá zložka pridaná do kontajnera je vyššia ako zložky pridané neskôr. Najčastejšie sa vývojár nezaoberá polohami komponentov. Keď pridáte komponenty, ich poloha sa automaticky zmení. Vrstvený panel vám však umožňuje dynamicky meniť polohu komponentov po ich pridaní do kontajnera.

Niektoré komponenty vo veľkej miere využívajú možnosti vrstvených panelov Hojdačka. Sú dôležité najmä pre aplikácie s viacerými dokumentmi, popisy nástrojov a ponuky. Multidokument Hojdačka aplikácie používajú špeciálnu nádobu JDesktopPane("desktop") zdedený z JLayeredPane A, ktorá drží vnútorné krídlové okná. Najdôležitejšie funkcie multidokumentovej aplikácie – umiestnenie „aktívneho“ okna nad ostatné, minimalizovanie okien, ich ťahanie – zabezpečujú mechanizmy vrstveného panelu. Hlavnou výhodou použitia vrstveného panela pre popisky a ponuky je ich rýchlosť. Namiesto vytvorenia nového ťažkého okna pre každý popis alebo ponuku umiestneného nad komponentom, v ktorom bol popis alebo ponuka vyžiadaná, Hojdačka vytvára rýchly ľahký komponent. Tento komponent je umiestnený v dostatočne vysokej vrstve vrstveného panelu vyššie v zásobníku všetkých ostatných komponentov a používa sa na zobrazenie tooltipu alebo ponuky.

Viacvrstvový panel umožňuje organizovať neobmedzený počet vrstiev. Štruktúra JLayeredPane obsahuje niekoľko štandardných vrstiev, ktoré využívajú všetky komponenty Swing, čo zaisťuje správne fungovanie všetkých mechanizmov vrstveného panelu. Štandardné vrstvy JLayeredPane sú zobrazené na nasledujúcom obrázku.

Predvolená vrstva sa používa na hosťovanie všetkých normálnych komponentov, ktoré sa pridávajú do kontajnera. Táto vrstva obsahuje vnútorné okná aplikácií s viacerými dokumentmi.

Vrstva Palette je navrhnutá tak, aby hostila okná so sadou nástrojov, ktoré sa zvyčajne prekrývajú so zvyškom rozhrania. Panel JDesktopPane umožňuje vytvárať také okná, ktoré ich umiestnia na túto vrstvu.

Vrstva Modal bola určená na umiestnenie ľahkých modálnych dialógových okien. Takéto dialógové okná však ešte nie sú implementované, takže táto vrstva sa momentálne v Swingu nepoužíva.

Najčastejšie používaná vrstva pre kontextové ponuky a popisy.

Najvyššia vrstva. Určené pre operácie drag and drop ( drag and drop drop), ktorý by mal byť jasne viditeľný v rozhraní programu.

Malý príklad JLayeredPane s vrstveným panelom ukazuje, ako pridať komponenty do rôznych vrstiev a ako sa vrstvy ukladajú na seba:

Importovať javax.swing.*; import java.awt.*; // trieda na kreslenie dvoch typov obrázkov s textovou triedou Figure rozširuje JComponent ( private static final long serialVersionUID = 1L; private Color color; private int type; private String text; // parametre: color and figure type Figure(Color color, int type, String text) ( this.color = color; this.type = type; this.text = text; setOpaque(false); ) public void paintComponent(Graphics g) ( // nakreslite obrázok g.setColor(color); switch (type ) ( case 0: g.fillOval(0, 0, 90, 90); break; case 1: g.fillRect(0, 0, 130, 80); break; ) g.setColor(Color.yellow) ; g. drawString(text, 10, 35); ) ) public class JLayeredPaneTest rozširuje JFrame ( private static final long serialVersionUID = 1L; public JLayeredPaneTest() ( // create window super("Example LayeredTest"); // ukončenie pri okne je zatvorené setDefaultCloseOperation( EXIT_ON_CLOSE); // definovať vrstvený panel JLayeredPane lp = getLayeredPane(); // vytvorenie troch tvarov Obrázok obrázok1 = nový Obrázok(Color.red , 0, "Obrázok po šteniatko"); Obrázok obrázok2 = nový obrázok(Farba.modrá, 0, "Obrázok 1"); Obrázok obrázok3 = nový obrázok(Farba.azúrová, 1, "Obrázok 2"); // určenie umiestnenia figúrok v okne figure1.setBounds(10, 40, 120, 120); postava2.setBounds(60, 120, 160, 180); postava3.setBounds(90, 55, 250, 180); // pridávanie tvarov do rôznych vrstiev lp.add(obrázok1, JLayeredPane.POPUP_LAYER); lp.add(obrázok2, JLayeredPane.PALETTE_LAYER); lp.add(obrázok3, JLayeredPane.PALETTE_LAYER); // zmena polohy jedného z obrázkov lp.setPosition(figure3, 0); // určenie veľkosti a otvorenie okna setSize(280, 250); setVisible(true); ) public static void main(String args) ( JFrame.setDefaultLookAndFeelDecorated(true); new JLayeredPaneTest(); ) )

Príklad vytvorí malé okno jFrame a do vrstveného panelu sa pridá viacero komponentov obrázku. Ak chcete získať vrstvený panel v akomkoľvek kontajneri Swing najvyššej úrovne, stačí zavolať metódu getLayeredPane().

Pomocná trieda Figure dedí vlastnosti základnej triedy JComponent a umožňuje kresliť dva typy tvarov (kruhy a obdĺžniky) s rôznymi farbami. Parametre na kreslenie tvarov sa nastavujú v konštruktore triedy.

Pri definovaní rozhrania sa vytvoria tri tvary rôznych farieb (dva kruhy a obdĺžnik). Kruh sa umiestni do vrstvy POPUP_LAYER a obdĺžniky sa umiestnia do vrstvy PALETTE_LAYER. Pri umiestňovaní komponentov sa zadávajú ich absolútne súradnice obrazovky, pretože obvyklí správcovia umiestnení nefungujú vo vrstvenom paneli.

Na konci sa poloha jedného z obdĺžnikov zmení tak, aby bol prvý vo vrstve, hoci pôvodne bol pridaný druhý. Po spustení aplikácie uvidíte, že vrstvený panel funguje a úhľadne usporiada komponenty podľa ich vrstiev a pozícií.

V konvenčných aplikáciách sa vrstvený panel zriedka používa priamo, v ktorom plní svoje funkcie neviditeľne. Niekedy však pomôže vytvoriť úžasné efekty a nezvyčajné rozhrania, napríklad vám umožní umiestniť animáciu alebo video na bežné komponenty bez toho, aby ste od vývojára vyžadovali nadľudské úsilie a triky.

ContentPane

ContentPane je ďalšou časťou koreňového panela a používa sa na hosťovanie komponentov používateľského rozhrania programu. ContentPane zaberá väčšinu priestoru vrstveného panela (okrem priestoru, ktorý zaberá panel s ponukami). Aby panel obsahu nezakrýval komponenty neskôr pridané do okna, panel s vrstvami ho umiestni na špeciálnu veľmi nízku vrstvu s názvom FRAME_CONTENT_LAYER s číslom -30000.

K panelu obsahu sa dostanete pomocou getContentPane() trieda JFrame. Pomocou metódy add(Component component) k nemu môžete pridať ľubovoľný ovládací prvok. Nahradiť ContentPane akýkoľvek iný panel typu JPanel, môžete použiť metódu setContentPane()

Príklad pridania tlačidla na panel obsahu:

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

V dôsledku toho dostaneme okno s tlačidlom. Tlačidlo zaberá celú dostupnú oblasť okna. Tento efekt nie je užitočný vo všetkých programoch, takže na usporiadanie prvkov na paneli musíte použiť rôzne spôsoby.

Panel obsahu je možné úplne vymeniť. Zvážte nasledujúce Hojdačka príklad panela obsahu ContentPane.

Importovať javax.swing.*; public class ContentPaneReplace rozširuje JFrame ( private static final long serialVersionUID = 1L; public ContentPaneReplace() ( super("Test ContentPane"); setDefaultCloseOperation(EXIT_ON_CLOSE); // Vytvorenie panelu s dvoma tlačidlami JPanel content = new JPanel(); content. add (new JButton("Rodina")); content.add(new JButton("School")); // Nahradenie panela obsahu setContentPane(contents); // Určenie veľkosti okna setSize(200, 100); // Otvorenie okna setVisible (true); ) public static void main(String args) ( JFrame.setDefaultLookAndFeelDecorated(true); new ContentPaneAdd(); ) )

Príklad vytvorí malé okno a panel s dvoma tlačidlami, ktorý je potom setContentPane() nahradí panel s obsahom okna. Namiesto jednoduchšieho sčítania sa teda použila náhrada – volanie metódy add (). Rozhranie okna je zobrazené na nasledujúcej snímke obrazovky.

Panel obsahu ContentPane samo o sebe nie je nič zvláštne. Musíte si len zapamätať, že komponenty sú k nemu pridané.

Transparentné JOptionPane

Priehľadný panel JOptionPane umiestnený ako koreňový panel nad všetkými prvkami vrstveného panelu. Umiestnenie JOptionPane je riešené koreňovým panelom, ktorý umiestni priehľadný panel nad panel s vrstvami tak, aby úplne pokrýval celú oblasť okna vrátane oblasti, ktorú zaberá panel s ponukami.

JOptionPane sa v aplikáciách používa len zriedka, takže v predvolenom nastavení je koreňový panel neviditeľný, čo znižuje zaťaženie systému kreslenia. Majte na pamäti, že ak zviditeľníte priehľadný panel, musíte sa uistiť, že je priehľadný (jeho vlastnosť nepriehľadnosť je falošná), pretože inak zakryje všetky ostatné prvky koreňového panela a zvyšok rozhrania bude neviditeľný.

V akých prípadoch možno použiť priehľadný panel? JOptionPane? Môže sa použiť na definovanie funkcií aplikácie, ktorých implementácia od začiatku vyžaduje značné úsilie. Priehľadný panel je možné prispôsobiť na automatizované testovanie používateľského rozhrania. Udalosti v ňom syntetizované vám umožňujú sledovať stredné výsledky ladenia. Niekedy je tento prístup oveľa efektívnejší ako manuálne testovanie.

Priehľadný panel JOptionPane možno použiť na vytváranie efektných animácií, ktoré „plávajú“ nad všetkými komponentmi vrátane panela s ponukami, alebo na zachytenie udalostí, ak je potrebné niektoré z nich spracovať pred odoslaním do hlavného používateľského rozhrania.

Príklad použitia priehľadného Swing JOptionPane:

// Použitie priehľadný panel 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; public class JOptionPaneTest rozširuje JFrame ( private static final long serialVersionUID = 1L; public static final Font FONT = new 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() ( public void windowActivated(WindowEvent event) () public void windowClosed(WindowEvent event) () public void windowDeactivated(WindowEvent event) () public void windowDeiconified (udalosť WindowEvent) () public void windowIconified (udalosť WindowEvent) () public void windowOpened (udalosť WindowEvent) () public void windowClosing (udalosť WindowEvent) ( Object options = ( "Áno", "Nie!" ); int rc = JOptionPane.showOptionDialog(event.getWindow(), "Zatvoriť okno?", "Potvrdiť", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options); (false);System.exit(0); ) ) )); JLabel label = new JLabel("Pri zatváraní okna použiť priehľadný panel"); frame.getContentPane().add(label); frame.setPreferredSize(new Dimension(350, 80)); 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); JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); createGUI(); ) )); ) )

Ak sa metóde setDefaultCloseOperation odovzdá konštanta JFrame.EXIT_ON_CLOSE, potom po zatvorení okna aplikácia prestane fungovať. V príklade sa tejto metóde odovzdá konštanta JFrame.DO_NOTHING_ON_CLOSE aby sa pri zatvorenom okne nič nestalo. Ukončenie aplikácie v príklade sa vykonáva z poslucháča JFrame WindowListener v metóde zatváranie okien. Po zatvorení okna sa zavolá metóda windowClosing s parametrom udalosti WindowEvent, ktorý v transparentnom Swing JOptionPane otvorí potvrdzovacie dialógové okno.

Nasledujúca snímka obrazovky zobrazuje dve okná aplikácie. Horné hlavné okno. Zatvorením tohto okna sa otvorí dolné dialógové okno na potvrdenie zámeru.

Panel s ponukami JMenuBar

Jednou z dôležitých funkcií používania koreňového panela JRootPane v Swing je potreba umiestniť do okna panel s ponukami. JMenuBar. Serióznu aplikáciu nemožno postaviť bez nejakého druhu menu pre prístup k funkciám programu. Knižnica Swing poskytuje vynikajúce možnosti na vytváranie pohodlných JMenuBars, ktoré sú zároveň ľahkými komponentmi.

Panel s ponukami JMenuBar umiestnený vo vrstvenom paneli v špeciálnej vrstve FRAME_CONTENT_LAYER a zaberá malý priestor v hornej časti okna. Dĺžka panela s ponukami sa rovná veľkosti okna. Šírka panela s ponukami závisí od komponentov, ktoré obsahuje.

Koreňový panel zabezpečuje, že panel obsahu a panel s ponukami JMenuBar neprekrývali. Ak sa panel ponuky nevyžaduje, potom koreňový panel využíva celý priestor na umiestnenie panela obsahu.

Príklady hojdačky

Zdrojové kódy príkladov diskutovaných v texte stránky si môžete stiahnuť.

V tomto krátkom článku chcem opísať proces vytvárania malého programu, ktorý podporuje GUI v danom jazyku Java. Predpokladá sa, že čitateľ je oboznámený so základmi jazyka. Java.

A aké nástroje teda potrebujeme:

  • Java Virtual Machine (OpenJDK alebo Oracle JDK)
  • Intellij IDEA (alebo iné IDE pre Java)

Po inštalácii potrebný softvér, OTVORENÉ IntelliJ IDEA a vytvorte nový projekt: Súbor -> Nový projekt…

Projekt som pomenoval guiBase. Ako môžete vidieť na snímke obrazovky, priečinok src nič neobsahuje, tak v ňom vytvoríme našu hlavnú triedu obsahujúcu funkciu hlavné.

Verejná trieda Main ( public static void main(String args) ( System.out.println("Ahoj, Govzalla!"); ) )

Pozrite si obsah hlavnej triedy vyššie. Teraz môžeme vytvoriť projekt ( vybudovať projekt ) a spustite ho ( Bežať ). Dole vo vašom termináli IDE zobrazí sa vám správa Dobrý deň, Govzalla!. Ale ako ste sami pochopili - nepodporuje GUI.

V tejto fáze už máme funkčný program, ale bez podpory GUI. A teraz v tom istom priečinku src vytvoriť GUI formulár: Nový -> GUI formulár

Otvorte vytvorený GUI formulár, kliknite na jPanel a nastavte jeho identifikátor v poli názov poľa, Opýtal som sa panel.

Potom presuňte myšou do formulára na pravej strane JTextField, JPasswordField a jButton:

Zostáva pridať kód a prepojiť s ním náš formulár. Keď sme pridali formu hlavné okno, trieda bola automaticky vytvorená hlavné okno, táto trieda je triedou vygenerovaného formulára, t.j. táto trieda bude slúžiť všetkým udalostiam danej formy.

Naša trieda okien síce obsahuje potrebné prvky, no ani teraz nemá nič spoločné s GUI, tak ju rozšírme o jFrame a zdediť všetky základné a potrebné funkcie GUI .

Momentálne máme formu hlavné okno a trieda hlavné okno predĺžený s jFrame. Teraz musíme definovať všetky pridané prvky GUI ako obsah triedy hlavné okno this.getContentPane().add(panel); Potom sa obsah súboru MainWindow.java zmení takto:

Importovať javax.swing.*; public class MainWindow rozširuje JFrame ( private JTextField textField1; private JPasswordField passwordField1; private JButton button1; private JPanel panel; public MainWindow() ( this.getContentPane().add(panel); ) )

Ak sa pokúsite spustiť kód, znova sa vám zobrazí rovnaká správa „Ahoj, Govzalla!“. Ide o to, že sme vytvorili triedu a jej formulár, ale nevytvorili sme inštanciu tejto triedy.

Je čas zmeniť súbor Main.java a pridať tam kód na vytvorenie nášho GUI:

Importovať java.awt.*; public class Main ( public static void main(String args) ( // Vytvorenie inštancie triedy MainWindow MainWindow mainWindow = new MainWindow(); // Zbalenie všetkých prvkov z nášho formulára mainWindow.pack(); // Zmena veľkosti okna mainWindow.setSize( new Dimension(200, 200)); // Zobrazenie vytvoreného okna mainWindow. setVisible(true); ) )

Spustenie kódu

Kliknutím na tlačidlo si všimnete, že program nijako nereaguje. Ide o to, že sme ešte nepridali poslucháča ( Poslucháč) na udalosti ( Diania) tlačidla.

poslucháč udalostí ( poslucháč udalostí) jButton musí ísť o implementáciu adaptéra ActionListener, takže do tela triedy pridajte nasledujúci kód hlavné okno:

Súkromná trieda MyButtonListener implementuje ActionListener ( @Override public void actionPerformed(ActionEvent actionEvent) ( ) )

Metóda akciaVykonaná() spracuje všetky udalosti tlačidla button1, ale najprv musíte stále povedať button1, akú triedu bude spracovávať, takže pridajte nasledujúci kód do konštruktora triedy MainWIndow: this.button1.addActionListener(new MyButtonListener()); Aby náš handler nebol bezvýznamný, pridajte do metódy nasledujúci kód akciaVykonaná():

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

Teraz bude program správne reagovať na udalosti, samozrejme nie na všetky udalosti. Napríklad, ak sa pokúsite vypnúť program kliknutím na krížik, okno zmizne, ale program bude stále fungovať, pretože. nebola pridaná obsluha udalosti hlavného okna.

Popis prezentácie Tvorba grafického rozhrania v knižniciach Java Graphic pomocou snímok

Java Graphical Libraries Java má tieto balíky na vytváranie grafických rozhraní: Abstract Windows Toolkit (AWT) – dodáva sa s JDK, každý komponent AWT má svoj vlastný vizuálny komponent (peer) pre konkrétny OS, prenosnosť zabezpečuje balík java. awt. rovesník; súbor grafických komponentov je obmedzený; vzhľad závisí od operačného systému. Standard Widget Toolkit (SWT) – dodávaný samostatne pre konkrétny OS, zahrnutý v prostredí Eclipce, interaguje s OS pomocou partnerských rozhraní, na rozdiel od AWT bola rozšírená ponuka komponentov. Swing – dodáva sa s JDK, rozširuje triedy AWT, nezávisí od partnerských komponentov OS. Java 3D - trojrozmerná grafika.

Komponenty s vysokou hmotnosťou a nízkou hmotnosťou Komponenty s vysokou hmotnosťou - Vykresľované operačným systémom - Väčšina komponentov AWT Odľahčené (ligntweight) komponenty - Vykresľované kódom java - Všetky komponenty Swing okrem okien najvyššej úrovne (okno aplikácie) Komponenty s vysokou hmotnosťou sú vždy nakreslené nad ľahkými komponentmi

Architektúra Model-View-Controller (MVC) Návrhový vzor MVC oddeľuje aplikačné dáta, používateľské rozhranie a logiku riadenia do troch samostatných komponentov – Model, View a Controller – takže každý komponent je možné upravovať nezávisle. Model (model) ukladá údaje komponentu a uľahčuje zmenu alebo prijímanie týchto údajov bez odkazu na komponent samotný. Zobraziť (zobraziť) zobrazuje údaje na obrazovke na prezentáciu používateľovi. Kontrolér určuje, ako má pohľad a údaje modelu reagovať na akcie používateľa.

Výhody MVC K rovnakému modelu môžete pripojiť viacero zobrazení bez ovplyvnenia implementácie modelu. Niektoré údaje môžu byť napríklad súčasne prezentované v tabuľke, stĺpcovom grafe a koláčovom grafe. Bez toho, aby ste ovplyvnili implementáciu zobrazení, môžete zmeniť reakcie na akcie používateľa (kliknutie na tlačidlo, zadávanie údajov), na to stačí použiť iný ovládač. Množstvo vývojárov sa špecializuje len na jednu z oblastí: buď vývoj grafického rozhrania, alebo vývoj obchodnej logiky. Preto je možné zabezpečiť, že programátori podieľajúci sa na vývoji obchodnej logiky (modelu) nebudú vedieť, ktorá reprezentácia sa vôbec použije.

Interakcie medzi modelom, zobrazením a ovládačom Klasický model Úzky vzťah medzi ovládačom a modelom a ovládačom a zobrazením. Pohľad (view) je spojený s jedným ovládačom a každý ovládač s jedným zobrazením. Zobrazenie a ovládač majú priame prepojenie na model.

MVC príklad verejnej triedy Model ( private int int. Array = (1, 2, 3, 4, 5); public String get. String. Array() ( return "int. Array=" + Arrays. to. String(int. Array); ) public void set.Int.Array(int index, int hodnota) ( ​​this.int.Array = hodnota; ) ) public class Controller ( Model model = new Model(); zobraziť pohľad= newView(); Controller()( update. View(); ) void set. Pole. Hodnota(int index, int hodnota) (model. sada. Int. Array(index, hodnota); aktualizácia. Zobraziť(); ) neplatná aktualizácia. View() ( view. show. Array(model. get. String. Array()); ) ) public class View ( public void show. Array(String array. String)( System. out. println("View"); System.out.println(array.String); System.out.println(); ) ) public class User ( public statc void main(String args) (Controller controller = new Controller(); controller.set.Array.Value( štrnásť);))

Model Swing zjednodušuje implementáciu Model nevie, s ktorým zástupcom používateľského rozhrania spolupracuje alebo ktorý komponent používa, nastavuje vzhľad a dojem pre všetky komponenty knižnice komunikuje s modelom iba prostredníctvom triedy komponentov. Pohľad ovládača spracováva používateľské udalosti a kreslí komponent na obrazovku Tlačidlá, zoznamy, tabuľky, textové polia...

Tlačidlo komponentov rozhrania — tlačidlo; JCheck. Box - zaškrtávacie políčko; jCombo. Box - rozbaľovací zoznam; JLabel - štítok, nápis; jList - zoznam; JPassword. Pole - textové pole pre skrytý vstup; JProgress. Bar - komponent na zobrazenie čísla v určitom rozsahu; JRadio. Tlačidlo - prepínače, prepínače, zvyčajne používané s komponentom Button. skupina; JSlider - komponent, ktorý umožňuje vybrať hodnotu z daného rozsahu; JTable - tabuľka; jtext. Pole je jednoriadkové textové pole; jtext. Oblasť je viacriadkové textové pole; JTree je strom.

Kontajnery rozhrania Časti používateľského rozhrania obsahujúce ďalšie komponenty Kontajnery najvyššej úrovne: Frame, JFrame - okno aplikácie; JDialog - dialóg aplikácie; jcolor. Výber - dialógové okno výberu farby; jfile. Chooser - dialógové okno pre výber súborov a adresárov; súbor. Dialóg - dialógové okno pre výber súborov a adresárov (komponent awt). Jednoduché kontajnery: JPanel - jednoduchý panel na zoskupovanie prvkov vrátane vnorených panelov; jTool. Lišta - panel nástrojov (zvyčajne tlačidlá); JScroll. Panel - posuvná lišta, ktorá umožňuje posúvať obsah podradeného prvku; JDesktop. Panel - kontajner na vytváranie virtuálnej pracovnej plochy alebo aplikácií založených na MDI (rozhranie viacerých dokumentov); JEditor. Panel, JText. Panel - kontajnery na zobrazenie komplexného dokumentu ako HTML alebo RTF; JTabbed. Panel - kontajner na správu záložiek;

Vytvorenie importu okna java. awt. *; trieda tiež. jednoduché. Frame extends Frame( public statc void main(String args)( Frame fr = new Too. Simple. Frame(); fr. set. Size(400, 150); // size of window fr. set. Visible(true); / /render window) // tlačidlo zavrieť nefunguje) Swing

Okno s vlastným importom ikon javax. hojdačka. *; Verejná trieda Rám. Zatvorením sa predĺži JFrame ( public Frame. Closing() ( super("Názov okna"); // operácia pri zatváraní sady okien. Predvolené. Zavrieť. Operaton(EXIT_ON_CLOSE); // pri zatváraní okna ikona ukončenia // pre sada okien. Icon.Image(get. Toolkit(). get. Image("icon.gif")); // C: / ikony / ikona. png // sada zobrazenia. Veľkosť(300, 100); // okno size width and height set.Visible(true); // render window ) public statc void main(String args) ( new Frame.Closing(); ) ) Swing

Štandardné dialógové okná Typ dialógového okna Popis NFORMATION_MESSAGE Dialógové okno zobrazuje všeobecné informácie s ikonou príslušného druhu WARNING_MESSAGE Dialógové okno zobrazuje varovné informácie s ikonou príslušného druhu QUESTION_MESSAGE Dialógové okno s otázkami na zadávanie informácií ERROR_MESSAGE Dialógové okno zobrazuje chybové informácie s ikonou príslušného druhu PLAIN_MESSAGE Označuje, že dialógové okno nepatrí do žiadneho z vyššie uvedených typov. Zobrazuje sa na obrazovke bez štandardnej ikony. Dialógové okná môžu byť modálne alebo nemodálne Dialógové okná môžu byť modálne (zamerajte sa na okno, kým nestlačíte tlačidlo) alebo nemodálne

Okná vstupov a správ importujú java. awt. *; importovať javax. hojdačka. *; public class Soluton ( public static void main(String args) ( JOpton. Panel. show. Message. Dialog(null , "Ahoj svet"); String s = JOpton. Panel. show. Input. Dialog("Zadajte svoje meno" ); ) ) Hojdačka

Štandardné rozloženia Java 1. Rozloženie okrajov. Rozloženie (polárne umiestnenie). 2. Flow Composer. Rozloženie (postupné umiestnenie). 3. Linker. Mriežka. Rozloženie (rozloženie tabuľky). 4. Pružinový linker. Rozloženie (relatívne umiestnenie). 5. Box linker. Rozloženie (umiestnenie bloku).

Polar Layout (Border.Layout layout) Hodnota Border.Layout. Rozloženie. SEVER alebo reťazec "Sever" - komponent je umiestnený pozdĺž horného (severného) okraja okna a natiahne sa na celú šírku. Zvyčajne sa tu nachádza panel s nástrojmi. Hraničná hodnota. Rozloženie. JUH alebo reťazec "Juh" - komponent je umiestnený pozdĺž spodného (južného) okraja a natiahne sa na celú šírku okna. Táto poloha je ideálna pre stavový riadok. Hraničná hodnota. Rozloženie. ZÁPAD alebo reťazec "Západ" - prvok sa nachádza pozdĺž ľavého (západného) okraja okna a natiahne sa na celú výšku, zohľadňujú sa však veľkosti severného a južného prvku (majú prednosť). Hraničná hodnota. Rozloženie. EAST alebo reťazec "East" - komponent sa nachádza pozdĺž pravého (východného) okraja okna. Inak je jeho umiestnenie podobné západnej zložke. Hraničná hodnota. Rozloženie. CENTER alebo čiara "Center" - komponent je umiestnený v strede okna a zaberá maximálny možný priestor.

Príklad použitia rozloženia Border. Import rozloženia javax. hojdačka. *; importovať java. awt. *; verejná trieda Hranica. Rozloženie. Sample rozširuje JFrame ( public Border. Layout. Sample() ( super("Border. Layout. Sample"); set. Size(400, 300); set. Default. Close. Operaton(EXIT_ON_CLOSE); // získanie panela obsahu triedy JFrame Container c = get.Content.Pane(); // Swing štandardne používa správcu Border.Layout // pridávanie komponentov do panelu pomocou reťazcových konštánt c.add(new JButton("North"), "North") c. add(new JButton("South"), "South"); // alebo konštanty z triedy Border. Layout // Element JLabel na zobrazenie textu c. add(new JLabel("West"), Border. Layout. WEST); c. add(new JLabel("East"), Border. Layout. EAST); // ak parameter nie je zadaný vôbec, komponent sa automaticky pridá do stredu c. add(new JButton(" Center")); // zobrazenie okna na obrazovke set.Visible(true); ) public statc void main(String args) ( new Border.Layout.Sample(); ) ) Swing

Sekvenčné umiestnenie (Flow. Layout layout) Rozloženie rozmiestňuje komponenty zľava doprava, zhora nadol (predvolené v Jpanels). importovať javax. hojdačka. *; importovať java. awt. *; verejná trieda Flow. Rozloženie. Sample rozširuje JFrame ( public Flow. Layout. Sample() ( super("Flow. Layout 1"); set. Size(400, 200); set. Default. Close. Operaton(EXIT_ON_CLOSE); // získanie panela obsahu Container c = get.Content.Pane(); // nastavenie komponentov tak, aby boli sekvenčné a zarovnané na stred c.set.Layout(new Flow.Layout(Flow.Layout.CENTER)); // pridanie komponentov c.add(new JButton(" One")); c. add(new JButton("Two")); c. add(new JButton("Tri")); // zobrazenie sady okien. Visible(true); ) public statc void main( String args) ( new Flow.Layout.Sample(); ) ) import java. awt. *; importovať javax. hojdačka. *; public class Soluton ( public static void main(String args) ( JOpton. Panel. show. Message. Dialog(null , "Hello, World"); ) ) Swing

Rozloženie tabuľky (Grid. Layout layout) všetky komponenty majú rovnakú veľkosť. Dostupný priestor je rozdelený na rovnaký počet buniek, v každej z nich je komponent umiestnený; všetky komponenty sú vždy prikreslené na obrazovku, bez ohľadu na to, aký veľký alebo malý je dostupný priestor. importovať java. awt. *; importovať javax. hojdačka. *; importovať java. utl. *; triedy Mriežka. Test rozširuje JFrame ( Grid. Test(String s)( super(s); Container c = get. Content. Pane(); // 4 riadky a 4 stĺpce s rozostupmi medzi riadkami a stĺpcami v pixeloch c. set. Layout(new Grid. Layout(4, 4, 5, 5)); String. Tokenizer st = nový String. Tokenizer("7 8 9 / 4 5 6 * 1 2 3 - 0. = +"); while(st. has. Viac. Tokens()) c. add(new Button(st. next. Token())); set. Size(200, 200); set. Visible(true); ) public statc void main(String args)( new Grid. Test(" Grid Manager. Layout"); ) ) Swing

Tabuľkové rozloženie dodá tlačidlám rovnakú veľkosť, pričom sekvenčné rozloženie zabráni ich „rozmazaniu“ a zároveň ich zarovná k pravému okraju importujem javu. awt. *; importovať javax. hojdačka. *; verejná trieda Príkaz. Buttons rozširuje JFrame ( public Command. Buttons() ( super("Command. Buttons"); set. Size(350, 250); set. Locaton(150, 100); set. Default. Close. Operaton(EXIT_ON_CLOSE); / / vytvorte panel s tabuľkovým rozložením na zarovnanie veľkostí tlačidiel JPanel grid = new JPanel(new Grid. Layout(1, 2, 5, 0)); // 1 riadok, 2 stĺpce, 5 pixelov horizontálne, 0 vertikálne. // pridať komponenty grid. add(new JButton("OK")); grid. add(new JButton("Cancel")); // vložiť výsledok do sekvenčného panela zarovnaného doprava JPanel flow = new JPanel( new Flow.Layout (Flow. Layout. RIGHT)); flow. add(grid); // získanie panela obsahu Container c = get. Content. Pane(); // vloženie riadku tlačidiel do spodnej časti okna c. add( flow, Border .Layout.SOUTH); // Nastavenie okna zobrazenia.Visible(true); ) public statc void main(String args) ( new Command.Buttons(); ) ) Swing

Usporiadanie rámčeka (Rozloženie rámčeka. Rozloženie rámčeka) Správca rozloženia poľa rozloží komponenty v kontajneri do blokov: stĺpec (pozdĺž osi Y) alebo pás (pozdĺž osi X), pričom každý jednotlivý komponent možno zarovnať na stred, vľavo alebo vpravo, ako aj hore alebo dole.

Príklad importu umiestnenia bloku java. awt. *; importovať javax. hojdačka. *; public class Box 1 rozširuje JFrame ( public Box 1() ( super("Box 1 - Y"); set. Size(400, 200); set. Default. Close. Operaton(EXIT_ON_CLOSE); // získanie panela obsahu Kontajner c = get.Content.Pane(); // nastavenie rozloženia y-boxu Box.Layout boxy = new Box.Layout(c, Box.Layout.Y_AXIS); c.set.Layout(boxy); // pridanie komponentov c . add(new JButton("One")); c. add(new JButton("Two")); c. add(new JButton("Tri")); // zobrazenie sady okien. Viditeľné (true); ) statc class Box 2 rozširuje JFrame ( public Box 2() ( super("Box 2 - X"); // nastavenie veľkosti a polohy boxu. Size(400, 200); set. Locaton(100, 100 ); set.Default.Close.Operaton(EXIT_ON_CLOSE); // získanie panela obsahu Container c = get.Content.Pane(); //nastavenie pozície x boxu (bar) Box.Layout boxx = new Box.Layout (c , Box. Layout. X_AXIS); c. set. Layout(boxx); // pridanie komponentov c. add(new JButton("One")); c. add(new JButton("Two")); c .add (nové JButton("Tri")); // zobrazenie okna na obrazovke setu. viditeľný(pravda); ) ) public statc void main(String args) ( new Box 1(); new Box 2(); ) ) Swing 5 Tento príklad vytvára dve okná. Jeden z nich implementuje blokové usporiadanie pozdĺž osi Y, druhý - blokové usporiadanie pozdĺž osi X.

Davydov Anton Valerijevič
Študent TSU, Rusko, Togliatti
Vedecký poradca: Erofeeva E.A.

Používateľské rozhranie v Jave prešlo veľmi tŕnistou cestou formovania a vývoja. Dlho bol obviňovaný z nenásytnosti systémových prostriedkov, pomalého výkonu a obmedzenej funkčnosti. Príchod .NET s rýchlejšími grafickými komponentmi ešte viac otriasol pozíciou Javy. Ale takáto konkurencia len podnietila Java vývojári k rozvoju a zdokonaľovaniu grafických knižníc. A v tomto článku uvidíme, čo z toho vzniklo.

Abstraktné okno Toolkit

Abstract Window Toolkit (skrátene AWT) bol prvýkrát vydaný v roku 1995 spoločnosťou Sun Microsystems. Bol to prvý pokus o vytvorenie GUI pre Javu. AWT fungovala ako vrstva, ktorá volala metódy z knižníc napísaných v C. A tieto metódy zase využívali grafické komponenty operačného systému. Na jednej strane takto zostavený program vyzeral podobne ako všetky ostatné programy na použitom operačnom systéme, no na druhej strane ten istý program môže na rôznych operačných systémoch vyzerať úplne inak, čo komplikuje vývoj. V záujme multiplatformnosti bolo navyše potrebné zjednotiť volacie rozhrania komponentov, čo viedlo k trochu oklieštenej funkčnosti. Pomerne skromná je aj zostava komponentov. Napríklad neexistujú žiadne tabuľky a ikony sa nedajú umiestniť do tlačidiel. AWT sa snaží automaticky uvoľniť použité zdroje. To ovplyvňuje výkon a komplikuje architektúru. AWT sa dá ľahko naučiť, ale napísať niečo zložité je ťažké. Teraz sa AWT používa hlavne pre applety. Oracle v súčasnosti povzbudzuje vývojárov, aby prešli na Swing, pretože je bezpečnejší.

Obr.1 - Vzorový program napísaný pomocou AWT v prostredí Windows

Po AWT, v roku 1998, Sun vydal Swing. Je napísaný celý v jazyku Java a na vykresľovanie používa 2D. Swing má oveľa širšiu škálu komponentov ako AWT. Samotné komponenty sa oveľa ľahšie vytvárajú dedením z existujúcich . Zavedená bola aj možnosť používať rôzne štýly a vzhľady. Rýchlosť skorých verzií Swingu však bola dosť nízka a chyby pri písaní programu mohli dokonca viesť k zamrznutiu operačného systému.

Avšak vďaka ľahkému učeniu a dostupnosti veľkého množstva dokumentácie sa Swing stal najobľúbenejším GUI v Jave. Na jej základe sa objavilo mnoho rozšírení, ako napríklad SwingX a JGoodies, ktoré ešte viac uľahčujú vytváranie vizuálne zložitých aplikácií. Všetky moderné programovacie prostredia Java zahŕňajú grafický editor Hojdačka. Aj keď v súčasnosti existujú modernejšie rámce, Swing zostáva najobľúbenejším.


Obr. 2 - Ukážka programu napísaná pomocou Swing

Štandardná súprava nástrojov widgetov

SWT vydalo IBM v čase, keď bol Swing ešte pomalý, a to hlavne kvôli propagácii programovacieho prostredia Eclipse. Podobne ako AWT, aj SWT používa komponenty OS, ale pre rôzne platformy sa používajú rôzne rozhrania interoperability. Pre každý operačný systém sa teda musí dodať samostatná knižnica JAR. To vám umožní lepšie využívať funkcie zodpovedajúce rôznym operačným systémom. A chýbajúce komponenty boli implementované pomocou 2D. Ukázalo sa však, že SWT je ťažšie zvládnuť ako Swing. Okrem toho musí programátor sám implementovať uvoľnenie zdrojov aplikáciou.

Obr.3 - Vzorový program napísaný pomocou Swing

JavaFX bol vydaný v roku 2008 spoločnosťou Oracle. Je umiestnený ako platforma na vytváranie bohatej internetovej aplikácie. Na vykresľovanie sa používa grafický pipeline, ktorý výrazne zrýchľuje aplikáciu. K dispozícii je veľká sada vstavaných komponentov. Existujú aj samostatné komponenty na vykresľovanie grafov. Implementovaná podpora pre multimediálny obsah, animácie a dokonca aj viacdotykové ovládanie. Vzhľad komponentov sa konfiguruje pomocou štýlov CSS. Okrem toho sada nástrojov JavaFX obsahuje možnosť vytvoriť natívny inštalátor pre najpopulárnejšie platformy: exe alebo msi pre Windows, deb alebo rpm pre Linux, dmg pre Mac. Webová stránka Oracle má podrobnú dokumentáciu a veľké množstvo hotových príkladov.

Po opísaní hlavných vlastností a nevýhod vyššie uvedených grafických používateľských rozhraní sa teda môžeme rozhodnúť, pre ktoré úlohy sú najvhodnejšie. Na vytváranie apletov je vhodnejší súbor nástrojov Abstract Window Toolkit. Začiatočník môže odporučiť Swing vzhľadom na skutočnosť, že na internete nájdete obrovské množstvo dokumentácie, a to aj v ruštine. JavaFX je skvelý na vytváranie bohatých internetových aplikácií.

Zoznam použitých zdrojov

    Ryzhenko A. V. Objektovo orientované programovanie: Vzdelávací a metodický komplex pre disciplínu pre špecializáciu 010501 - "Aplikovaná matematika a informatika". – 2007.

    Khabibullin I. Sh. Java 7 (4. vydanie). - BHV-Petersburg, 2012.

    Clarke J., Connors J., Bruno E. J. JavaFX: Vývoj bohatých internetových aplikácií. – Pearson Education, 2009.

    Northover S., Wilson M. Swt: štandardná sada nástrojov widgetov, zväzok 1. - Addison Wesley Professional, 2004.

Používateľské rozhranie v Jave prešlo veľmi tŕnistou cestou formovania a vývoja. Na dlhú dobu vyčítali mu pomalú prácu, nenásytnosť systémových prostriedkov, obmedzenú funkčnosť. Príchod .NET s rýchlejšími grafickými komponentmi ešte viac otriasol pozíciou Javy. Ale každý mrak má striebornú podšívku – celý tento pohyb len podnietil vývojárov Java k vývoju a vylepšovaniu grafických knižníc. Pozrime sa, čo z toho vzniklo.

Abstraktné okno Toolkit

AWT bol prvým pokusom spoločnosti Sun o grafické používateľské rozhranie pre Javu. Išli jednoduchšou cestou a práve vytvorili vrstvu Java, ktorá volá metódy z knižníc napísaných v C. Knižničné metódy vytvárajú a používajú grafické komponenty operačného prostredia. Na jednej strane je to dobré, pretože program Java je podobný iným programom v tomto OS. Na druhej strane však nie je zaručené, že rozdiely vo veľkostiach komponentov a fontoch nepokazia vzhľad programu, keď je spustený na inej platforme. Pre zabezpečenie multiplatformnosti bolo navyše potrebné zjednotiť volacie rozhrania komponentov, preto sa ich funkcionalita ukázala ako trochu oklieštená. A súbor komponentov sa ukázal byť dosť malý. Napríklad AWT nemá tabuľky a tlačidlá nepodporujú zobrazovanie ikon.

Použité zdroje sa AWT pokúša uvoľniť automaticky. To mierne komplikuje architektúru a ovplyvňuje výkon. Naučiť sa AWT je celkom jednoduché, ale napísať niečo zložité môže byť trochu zložité. Teraz sa používa iba pre applety.

Výhody:

  • časť JDK;
  • rýchlosť práce;
  • grafické komponenty sú podobné štandardným.

nedostatky:

  • použitie natívnych komponentov ukladá obmedzenia na využitie ich vlastností. Niektoré komponenty nemusia vôbec fungovať na „nenatívnych“ platformách;
  • niektoré vlastnosti, ako napríklad ikony a popisky, v AWT vôbec neexistujú;
  • Existuje veľmi málo štandardných komponentov AWT, programátor musí implementovať veľa vlastných;
  • program vyzera inak rôzne platformy(môže byť krivé).

záver:

V súčasnosti sa AWT používa veľmi zriedkavo - hlavne v starých projektoch a apletoch. Oracle skryl tutoriály a dôrazne odporúča prechod na Swing. Je to pochopiteľné, priamy prístup ku komponentom osi môže byť vážnou bezpečnostnou dierou.

Hojdačka


Po AWT vyvinul Sun sadu grafických komponentov s názvom Swing. Swing komponenty sú napísané výhradne v Jave. Na vykresľovanie sa používa 2D, čo so sebou prináša hneď niekoľko výhod. Súbor štandardných komponentov ďaleko prevyšuje AWT z hľadiska rozmanitosti a funkčnosti. Je ľahké vytvárať nové komponenty, dediť z existujúcich a kresliť čokoľvek, po čom vaše srdce túži. Podpora rôznych štýlov a vzhľadov je možná. Rýchlosť prvých verzií Swingu však zostala veľmi neuspokojivá. Nesprávne napísaný program by dokonca mohol Windows pevne zavesiť.

Napriek tomu sa Swing vďaka jednoduchému použitiu, bohatej dokumentácii a flexibilným komponentom stal snáď najpopulárnejším grafickým rámcom v Jave. Na jeho základe sa objavilo mnoho rozšírení, ako napríklad SwingX, JGoodies, ktoré výrazne zjednodušujú vytváranie zložitých používateľských rozhraní. Takmer všetky populárne programovacie prostredia Java obsahujú grafické editory pre formuláre Swing. Preto nebude ťažké pochopiť a začať používať Swing.

Výhody:

  • súčasť JDK, nie je potrebné inštalovať ďalšie knižnice;
  • na Swing je oveľa viac kníh a odpovedí na fórach. Všetky problémy, najmä pre začiatočníkov, sú spoločnosti Google dôkladne známe;
  • vstavaný editor formulárov takmer vo všetkých vývojových prostrediach;
  • existuje veľa rozšírení založených na swingu ako SwingX;
  • podpora rôznych štýlov (vzhľad a dojem).

nedostatky:

  • okno s mnohými komponentmi sa začne spomaľovať;
  • práca so správcami rozloženia môže byť v zložitých rozhraniach skutočnou nočnou morou.

Záver:

Swing žil, Swing žije, Swing bude žiť. Hoci sa Oracle snaží propagovať JavaFX, Swing zostáva dnes najpopulárnejším frameworkom Java UI.

Štandardná súprava nástrojov widgetov


Ako
vyzerá
SWT

SWT bol vyvinutý v IBM v časoch, keď bol Swing ešte pomalý, a robilo sa to hlavne na propagáciu programovacieho prostredia Eclipse. SWT, podobne ako AWT, používa komponenty operačného systému, no pre každú platformu má svoje interakčné rozhrania. Takže pre každého nový systém budete musieť dodať samostatnú knižnicu JAR s príslušnou verziou SWT. To umožnilo úplnejšie využitie existujúcich funkcií komponentov na každej osi. Chýbajúce funkcie a komponenty boli implementované pomocou 2D, ako v Swing. SWT má veľa prívržencov, ale pri všetkej úprimnosti nemožno súhlasiť s tým, že sa ukázalo, že všetko nie je také jednoduché, ako by sme chceli. Začiatočník bude musieť stráviť oveľa viac času učením sa SWT ako zoznamovaním sa s rovnakým Swingom. SWT navyše kladie za úlohu uvoľniť zdroje programátorovi, a preto si pri písaní kódu musí dávať obzvlášť pozor, aby náhodná výnimka neviedla k úniku pamäte.

Výhody:

  • používa komponenty operačného systému - rýchlosť je vyššia;
  • Eclipse poskytuje vizuálny editor formuláre;
  • rozsiahla dokumentácia a veľa príkladov;
  • je možné použiť komponenty AWT a Swing.

nedostatky:

  • pre každú platformu je potrebné dodať samostatnú knižnicu;
  • musíte neustále monitorovať využitie zdrojov a včas ich uvoľniť;
  • komplexná architektúra, vyvolávajúca samovražedné myšlienky po márnych pokusoch implementovať vlastné rozhranie.

Záver:

Je vidieť, že IBM sa snažilo. Ale dopadlo to veľmi amatérsky...

JavaFX


JavaFX možno bez preháňania nazvať prelomovým. Na vykresľovanie sa používa grafický pipeline, ktorý výrazne zrýchľuje aplikáciu. Sada vstavaných komponentov je rozsiahla, dokonca existujú aj samostatné komponenty na kreslenie grafov. Implementovaná podpora multimediálneho obsahu, množstvo zobrazovacích efektov, animácií a dokonca aj viacdotykové ovládanie. Vzhľad všetkých komponentov je možné jednoducho meniť pomocou CSS štýlov. A najlepšie na tom je, že JavaFX obsahuje sadu nástrojov, ktoré vám umožňujú vytvoriť natívny inštalačný program pre najpopulárnejšie platformy: exe alebo msi pre Windows, deb alebo rpm pre Linux, dmg pre Mac. Na webovej stránke Oracle nájdete podrobnú dokumentáciu a obrovské množstvo hotových príkladov. Vďaka tomu je programovanie s JavaFX jednoduché a zábavné.

Výhody:

  • rýchla práca vďaka grafickému kanálu;
  • veľa rôznych komponentov;
  • podpora štýlu;
  • nástroje na vytvorenie inštalátora programu;
  • aplikáciu je možné spustiť ako pracovnú plochu a v prehliadači ako súčasť stránky.

nedostatky:

  • framework sa stále vyvíja, takže dochádza k pádom a chybám;
  • JavaFX sa zatiaľ veľmi nepoužíva.

Záver:

Dobrá práca, Oracle. Rámec zanecháva len pozitívne dojmy. Je ľahko pochopiteľný, metódy a rozhrania vyzerajú logicky. Chcem používať znova a znova!

Vizuálne knižnice v praxi

SWT: widget počasia

Aby sme demonštrovali možnosti najobľúbenejších grafických knižníc a základné princípy práce s nimi, urobíme niekoľko malých widgetov, ktoré zobrazujú rôzne informácie.

A začnime možno najobľúbenejším widgetom - zobrazením aktuálneho počasia, na implementáciu ktorého zvolíme SWT.

Každý SWT program začína vytvorením objektu Display. Slúži ako druh aplikačného kontextu, ktorý obsahuje potrebné metódy na prístup k systémovým zdrojom a poskytuje slučku udalostí. Ďalším krokom je vytvorenie rovnako dôležitého objektu Shell. Shell je normálne okno operačného systému. Zobrazenie sa odovzdá konštruktorovi shellu na vytvorenie okna najvyššej úrovne.

Display display = new Display(); shell = new Shell(zobrazenie, SWT.NO_TRIM);

Keďže vytvárame widget, nepotrebujeme zobrazovať štandardný rám okna a ovládacie tlačidlá, na to sme určili príznak NO_TRIM. Na pozadie použijeme obrázok - obdĺžnik so zaoblenými rohmi. V zásade môže mať okno SWT akýkoľvek tvar. Na dosiahnutie tohto efektu používame triedu Region. Všetko, čo je potrebné, je pridať do tejto triedy všetky viditeľné body z obrázka na pozadí a preskočiť tie priehľadné.

Nahrávanie obrázka:

Obrázok obrázku = nový obrázok(zobrazenie, "images/bg.png#26759185");

V obrázkoch rôznych formátov je priehľadnosť nastavená rôznymi spôsobmi, takže informácie o priehľadných oblastiach sa tiež nenačítajú rovnakým spôsobom. Vytvorte oblasť pozadia a pridajte tam všetky viditeľné bodky:

Región región = new Region(); ImageData imageData = image.getImageData(); if (imageData.alphaData != null) ( pixel obdĺžnika = nový obdĺžnik(0, 0, 1, 1); for (int y = 0; y< imageData.height; y++) { for (int x = 0; x < imageData.width; x++) { if (imageData.getAlpha(x, y) == 255) { pixel.x = imageData.x + x; pixel.y = imageData.y + y; region.add(pixel); } } } } else { ImageData mask = imageData.getTransparencyMask(); Rectangle pixel = new Rectangle(0, 0, 1, 1); for (int y = 0; y < mask.height; y++) { for (int x = 0; x < mask.width; x++) { if (mask.getPixel(x, y) != 0) { pixel.x = imageData.x + x; pixel.y = imageData.y + y; region.add(pixel); } } } }

Nastaviť tvar okna:

Shell.setRegion(región);

Teraz musíme vytvoriť poslucháč udalostí pre okno. Nás budú zaujímať udalosti kreslenia okien, udalosti myši a stlačenie klávesov, aby sa okno dalo pohybovať po obrazovke.

Poslucháč poslucháča = new Listener() ( int startX, startY; public void handleEvent(Event e) ( if (e.type == SWT.KeyDown && e.character == SWT.ESC) ( shell.dispose(); ) if (e.type == SWT.MouseDown && e.button == 1) ( startX = e.x; startY = e.y; ) if (e.type == SWT.MouseMove && (e.stateMask & SWT.BUTTON1) != 0 ) ( Bod p = shell.toDisplay(e.x, e.y); p.x -= startX; p.y -= startY; shell.setLocation(p); ) if (e.type == SWT.Paint) ( napr.gc.drawImage( image, imageData.x, imageData.y); ) ));

Takže stlačením klávesu Esc sa okno zatvorí. Keď stlačíte ľavé tlačidlo myši v oblasti okna, zapamätajte si súradnice kliknutia. Pri pohybe myšou so stlačeným ľavým tlačidlom posúvame okno na obrazovke podľa pohybu. Pri udalosti prekreslenia - nakreslite obrázok na pozadí pomocou grafického kontextu GC.

Priraďte poslucháča zodpovedajúcim udalostiam okna:

Shell.addListener(SWT.KeyDown, poslucháč); shell.addListener(SWT.MouseDown, poslucháč); shell.addListener(SWT.MouseMove, poslucháč); shell.addListener(SWT.Paint, posluchac);

Nastavte veľkosť okna podľa veľkosti obrázka:

Shell.setSize(imageData.x + imageData.width, imageData.y + imageData.height);

Otvorte okno a spustite slučku udalostí:

Shell.open(); while (!shell.isDisposed ()) ( if (!display.readAndDispatch ()) display.sleep (); )

Na konci nezabudnite uvoľniť použité zdroje:

region.dispose(); image.dispose(); display.dispose();

Spustením programu v tejto fáze získame obdĺžnik, ktorý možno posúvať myšou a zatvárať pomocou Esc.

Je čas pridať obsah. Zobrazíme aktuálne počasie vo forme stavovej ikony (slnečno, dážď, sneženie ...), namerané teploty a čas poslednej aktualizácie.

Správcovia rozloženia slúžia na usporiadanie grafických komponentov v okne do požadovanej podoby. Správca rozloženia sa zaoberá nielen usporiadaním komponentov, ale aj zmenou ich veľkosti pri zmene veľkosti okna. Pre náš widget použijeme GridLayout. Tento manažér usporiada komponenty do buniek imaginárnej tabuľky. Vytvorte GridBagLayout pre dva stĺpce s rôznymi šírkami stĺpcov (falošný príznak v konštruktore), nastavte ho ako správcu rozloženia okna:

GridLayout layout = new GridLayout(2, false); shell.setLayout(layout);

Pre stavový obrázok používame komponent Label. Objekt okna odovzdávame ako rodič. Druhým parametrom je nastavenie štýlu komponentu. Pre každý komponent je množina možných príznakov štýlu iná, možno ich nájsť v dokumentácii alebo priamo v zdrojovom kóde komponentu.

//nakreslite stavový obrázok Label imageLabel = new Label(shell, SWT.NONE); imageLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true, 1, 1));

Príznaky v triede GridData znamenajú, že štítok bude umiestnený vľavo hore, roztiahne sa horizontálne a vertikálne (príznaky sú nastavené na hodnotu true), keď je voľné miesto, a zaberá jeden riadok a jeden stĺpec tabuľky rozloženia.

Nie v SWT priehľadné pozadie komponenty a za stavovým obrázkom sa bude chvieť biele pozadie, čo by, samozrejme, nebolo žiaduce. Vytvorme teda objekt Color s farbou pozadia okna:

Farba bgColor = nová farba(zobrazenie, 0x2b, 0x2b, 0x2b);

Na konci programu musí byť tento objekt tiež vyčistený volaním metódy zlikvidovania. Nastavte farbu pozadia a obrázok stavu, ktorý je možné načítať zo súboru rovnakým spôsobom, ako sme načítali obrázok pozadia na začiatku:

ImageLabel.setBackground(bgColor); Stav obrázkaObrázok = nový obrázok(zobrazenie, "obrázky/1.png#26759185"); imageLabel.setImage(statusImage);

Teraz pridáme štítok s aktuálnou teplotou a umiestnime ho do pravej hornej časti okna:

Label temperatureLabel = new Label(shell, SWT.NONE); TeplotaLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false, 1, 1));

Nastavíme teplotu:

TemperatureLabel.setText("+1 \u2103");

Na zaznamenanie teploty v stupňoch Celzia sa používa číslo Unicode zodpovedajúceho znaku so servisnými znakmi \u.

Predvolené písmo pre textové štítky je príliš malé. Vytvorme teda nový, väčší:

FontData fD = temperatureLabel.getFont().getFontData(); fD.setHeight(30); fD.setStyle(SWT.BOLD); Font newFont = new Font(zobrazenie, fD); temperatureLabel.setFont(newFont); Písmo, podobne ako iné zdrojové objekty, je potrebné uvoľniť. Na tento účel používame poslucháč udalosti zničenia štítkov:

TemperatureLabel.addDisposeListener(new DisposeListener() ( public void widgetDisposed(DisposeEvent e) ( newFont.dispose(); ) ));

Nakoniec pridajme štítok popisujúci poveternostné podmienky:

Popis menovkyLabel = new Label(shell, SWT.WRAP); descriptionLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 1)); descriptionLabel.setText("Zamračené s čistinami, slabý dážď"); descriptionLabel.setBackground(bgColor); descriptionLabel.setForeground(display.getSystemColor(SWT.COLOR_WHITE));

Text môže byť dosť dlhý, preto pri vytváraní štítku zadávame príznak WRAP, aby sa text pri nedostatku miesta automaticky rozdelil na niekoľko riadkov. Vycentrujeme komponent a necháme ho vyplniť celý horizontálny priestor. Tiež určíme, že komponent zaberá dva stĺpce tabuľky rozloženia. Spustíme a získame okno z obrázka "Weather Widget".

Teraz môžete pripojiť nejaký druh meteorologickej služby, vytvoriť časovač pre automatické aktualizácie - a miniaplikácia je pripravená.

Swing: vždy čerstvé novinky

V Swingu napíšeme widget na zobrazenie RSS kanálov. Začneme, ako minule, vytvorením okna. Trieda, ktorá implementuje štandardnú funkčnosť okna v Swing, sa nazýva JFrame. V predvolenom nastavení zatvorenie okna aplikácie v Swing nespôsobí zastavenie programu, takže je lepšie určiť, ako sa má okno správať pri zatvorení:

JFrame frame = new JFrame(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

Na prezentáciu noviniek je najvhodnejší stôl. Swing je postavený na vzore Model-View-Controller (MVC). V architektúre MVC model poskytuje údaje, pohľad je zodpovedný za zobrazenie údajov (napr. text, vstupné polia) a ovládač zabezpečuje interakciu medzi modelom a pohľadom. Tabuľka dobre ukazuje tento prístup. Na reprezentáciu údajov sa používa trieda, ktorá implementuje rozhranie TableModel.

Ak chcete uložiť informácie o dostupných novinkách, vytvorte triedu FeedMessage s poľami pre názov článku a dátum vydania:

Verejná trieda FeedMessage (verejný názov reťazca; verejný Dátum zverejnenia; )

Pre zjednodušenie a zrýchlenie vývoja dedíme náš dátový model z triedy AbstractTableModel, ktorá ponúka hotovú implementáciu takmer všetkých metód rozhrania TableModel.

Verejná trieda RssFeedTableModel rozširuje AbstractTableModel ( súkromný zoznam záznamy = nový ArrayList<>(); public void updateData(Zoznam entries) ( this.entries = entries; fireTableDataChanged(); ) public int getRowCount() ( return entries.size(); ) public int getColumnCount() ( return 2; ) public Object getValueAt(int rowIndex, int columnIndex) ( switch (columnIndex) ( prípad 0: return entries.get(rowIndex).title; prípad 1: return entries.get(rowIndex).publicationDate; ) return null; ) )

Metóda fireTableDataChanged informuje pohľad, že dátový model sa zmenil a je potrebné ho znova vykresliť.

Vytvoríme tabuľku a trochu zmeníme jej vzhľad, aby vyzeral skôr ako widget. Odstránime čiary medzi riadkami a stĺpcami, zväčšíme výšku riadkov a odstránime hlavičku tabuľky s názvami stĺpcov:

Tabuľka JTable = new JTable(new RssFeedTableModel()); tablesetShowGrid(false); table.setIntercellSpacing(new Dimension(0, 0)); tablesetRowHeight(30); table.setTableHeader(null);

Teraz sa poďme zamestnať vzhľad bunky. Swing vám umožňuje priradiť oddelené triedy pohľadov k rôznym typom údajov. Trieda, ktorá zdedí rozhranie TableCellRenderer, je zodpovedná za vykreslenie jednotlivých buniek tabuľky. Predvolená hodnota je DefaultTableCellRenderer, čo je textový štítok.

Priraďme náš vykresľovač buniek k údajom String. Poďme zmeniť predvolenú farbu písma a zmeniť farbu pozadia, aby sa zlepšila čitateľnosť.

Table.setDefaultRenderer(String.class, new DefaultTableCellRenderer() ( Color oddColor = new Color(0x25, 0x25, 0x25); Color evenColor = new Color(0x1a, 0x1a, 0x1a); Color titleColor = new Color(0x3a, 0xd72, ); verejný komponent getTableCellRendererComponent(tabuľka JTable, hodnota objektu, booleovský isSelected, booleovský hasFocus, int riadok, int stĺpec) ( super.getTableCellRendererComponent(tabuľka, hodnota, isSelected, hasFocus, riadok, stĺpec); setBackground(riadok % 2 == 0 ?oddColor: EvenColor); setForeground(titleColor); setFont(font); return this; ) ));

Aby tabuľka mohla začať používať náš renderer, musíme pridať metódu, ktorá vráti dátový typ pre každú bunku do dátového modelu:

verejná triedagetColumnClass(int columnIndex) ( switch (columnIndex) ( case 0: return String.class; case 1: return Date.class; ) return Object.class; )

Noviniek môže byť veľa, tak položme tabuľku na posuvnú lištu a urobme posuvnú lištu neviditeľnou, aby nám nekazila dizajn widgetu:

JScrollPane scrollPane = new JScrollPane(tabuľka); table.setFillsViewportHeight(true); scrollPane.getVerticalScrollBar().setPreferredSize(new Dimension(0,0));

Pridanie rolovacieho komponentu na hlavnú tablu okna. Druhým argumentom môže byť umiestnenie komponentu. Hlavná tabla okna štandardne používa správcu rozloženia BorderLayout, ktorý rozmiestňuje komponenty podľa svetových strán. Umiestnime tabuľku s rolovaním do stredu.

Frame.getContentPane().add(scrollPane, BorderLayout.CENTER);

Ako minule, odstránime štandardný rám okna. A ako nadpis okna použijeme štylizovaný textový štítok, ktorý umiestnime v hornej časti okna.

JLabel titleLabel = new JLabel("Xakep RSS"); Názov písmaFont = new Font("Arial", Font.BOLD, 20); titleLabel.setFont(titleFont); titleLabel.setHorizontalAlignment(SwingConstants.CENTER); titleLabel.setForeground(Color.WHITE); titleLabel.setPreferredSize(new Dimension(0, 40)); frame.getContentPane().add(titleLabel, BorderLayout.NORTH);

Na rozdiel od SWT sa objekty „color“ a „font“ uvoľnia automaticky, takže sa už nemusíte obávať úniku pamäte.

Pridávame poslucháče myši, aby sa okno dalo posúvať po obrazovke.

Prijímač MouseAdapter = new MouseAdapter() ( int startX; int startY; public void mousePressed(MouseEvent e) ( if (e.getButton() == MouseEvent.BUTTON1) ( startX = e.getX(); startY = e.getY( ); ) ) public void mouseDragged(MouseEvent e) ( Point currCoords = e.getLocationOnScreen(); frame.setLocation(currCoords.x - startX, currCoords.y - startY); ) ); titleLabel.addMouseListener(počúvač); titleLabel.addMouseMotionListener(počúvač);

Teraz zmeňte tvar okna na obdĺžnik so zaoblenými rohmi. Najlepšie je to urobiť v poslucháčovi komponentu, pretože ak sa zmení veľkosť okna, tvar okna sa správne prepočíta:

Frame.addComponentListener(new ComponentAdapter() ( public void componentResized(ComponentEvent e) ( frame.setShape(new RoundRectangle2D.Double(0, 0, frame.getWidth(), frame.getHeight(), 20, 20)); ) ) );

Nastavte veľkosť okna, odstráňte rám a urobte okno polopriehľadné.

Frame.setSize(520, 300); frame.setUndecorated(true); frame.setOpacity(0.85f);

Nakoniec otvoríme okno v grafickom vlákne. SwingUtilities.invokeLater(new Runnable() ( public void run() ( frame.setVisible(true); ) ));

Zostáva pridať načítanie dát v samostatnom vlákne a získame takýto widget s najnovšími správami z vášho obľúbeného časopisu :).


JavaFX: Poďme počúvať hudbu

A nakoniec, vrcholom sezóny je JavaFX. Využime jeho multimediálne možnosti a grafickú zložku a vyrobme si jednoduchý ekvalizér.

Najprv zdedíme triedu widgetov z aplikácie. Toto je hlavná trieda aplikácií v JavaFX. Aplikácia obsahuje hlavné metódy životného cyklu aplikácie. Komponenty formulára sa vytvárajú v metóde štart, ktorej argumentom je trieda Stage. Stage predstavuje okno programu. Zmeňte štýl okna na TRANSPARENT, aby ste odstránili orámovanie a tlačidlá. Trieda Stage obsahuje triedu Scene, ktorá nastavuje veľkosť okna a farbu pozadia. V Scene zase prejdeme triedou Group, do ktorej umiestnime podradené komponenty:

Public void start(Stage PrimaryStage) ( PrimaryStage.initStyle(StageStyle.TRANSPARENT); Koreň skupiny = new Group(); Scéna scény = new Scene(root, 400, 200, Color.TRANSPARENT); PrimaryStage.setScene(scene);

Na zobrazenie ekvalizéra používame stĺpcový graf, pozdĺž ktorého osí zobrazíme frekvenciu a zvukový výkon:

CategoryAxis xAxis = new CategoryAxis(); NumberAxis yAxis = new NumberAxis(0,50,10); BarChart bc = nový BarChart (os x, os y); bc.setPrefSize(400, 200); bc.setLegendVisible(false); bc.setAnimated(false); bc.setBarGap(0); bc.setCategoryGap(1); bc.setVerticalGridLinesVisible(false); bc.setHorizontalGridLinesVisible(false); xAxis.setLabel("Frekvencia"); yAxis.setLabel("Napájanie"); yAxis.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxis, null, "dB"));

Vyplňte diagram počiatočnými údajmi:

XYChart.Series séria1 = nový XYChart.Series (); series1Data = new XYChart.Data; Kategórie reťazcov = nový reťazec; pre (int i=0; i (kategórie[i], 50); series1.getData().add(series1Data[i]); ) bc.getData().add(series1);

Vytvorte obdĺžnik so zaoblenými rohmi, aby mal widget vhodný tvar:

Obdlznik obdlznik = new Rectangle(0, 0, 400, 200); Stop zastaví = new Stop ( new Stop(0, new Color(0, 0, 0, 0,8)), null); LinearGradient lg2 = new LinearGradient(0, 0, 0, 0, false, CycleMethod.NO_CYCLE, stops); obdlznik.setFill(lg2); rectangle.setArcHeight(20); rectangle.setArcWidth(20);

Pridajte do skupiny oba komponenty:

Root.getChildren().addAll(obdĺžnik, bc);

Priraďte skupine poslucháčov myši, aby ste mohli posúvať okno po obrazovke:

Root.setOnMousePressed(nový EventHandler () ( public void handle(MouseEvent me) ( initX = me.getScreenX() - PrimaryStage.getX(); initY = me.getScreenY() - PrimaryStage.getY(); ) )); root.setOnMouseDragged(nové EventHandler () ( public void handle(MouseEvent me) ( primaryStage.setX(me.getScreenX() - initX); primaryStage.setY(me.getScreenY() - initY); ) ));

Stiahnite si skladbu do prehrávača:

Súbor súbor = nový Súbor("pusti ma odtiaľto.mp3"); media audioMedia = null; audioMedia = new Media(file.toURI().toURL().toString()); audioMediaPlayer = new MediaPlayer(audioMedia);

Pridajte poslucháča, ktorý aktualizuje stĺpcový graf:

AudioMediaPlayer.setAudioSpectrumListener(new AudioSpectrumListener() ( public void SpectrumDataUpdate(dvojitá časová pečiatka, dvojité trvanie, pohyblivé magnitúdy, pohyblivé fázy) (for (int i = 0; i< series1Data.length; i++) { series1Data[i].setYValue(magnitudes[i] + 60); } } });

Zviditeľnite scénu a prehrajte skladbu:

PrimaryStage.show(); audioMediaPlayer.play();

Spustíme aplikáciu:

Verejné statické void main (String args) ( launch(args); )

A užite si túto krásu.