Namo

7. Swing paketas

Paketo apžvalga

Swing yra modernus Java vartotojo grafinės aplinkos programavimo paketas. Anksčiau mes aptarėme Java AWT paketą, kuris taip pat skirtas kurti vartotojo aplinką. Nors Swing yra modernesnis ir turi platesnes galimybes, tačiau dažnai šie du paketai naudojami kartu ir kartais papildo vienas kitą. Jūs galite toje pačioje programone kurti valdymo elementus panaudojant JMenu ar JButton Swing paketo klases ir Menu ar Button AWT paketo klases, o įvykius apdoroti panaudojant vieną ir tą patį ActionListener interfeisą, apibrėžtą java.awt.event pakete.

Pagrindinis skirtumas tarp Swing ir AWT paketų glūdi jų realizacijoje. AWT objektų realizaciją atlieka interpretatorius ir kiekvienai platformai yra kuriamas specialus kodas. Swing yra kuriami universalūs nepriklausantys nuo konkrečios platformos vartojo grafinės aplinkos objektai. Swing atveju yra pasiekiamas pilnas nepriklausomumas nuo platformos ir šio paketo kūrimas yra labiau ekonomiškas, nes nereikia rašyti kiekvienai platformai adaptuoto kodo.

AWT ir Swing paketai yra labai platūs. Gera žinia, kad abiejų paketų daugelis klasių beveik dubliuoja vienas kitą ir todėl įsisavinus vieno paketo klases kartu išmokstama panaudoti ir kito paketo analogiškas klases. Iš šios taisyklės iškrenta Swing lentelių, procesų indikatoriai, medžiai ir kai kurie kiti elementai, kurie paprasčiausiai neturi AWT analogų. Apie tokius Swing elementus pakalbėsime kiek plačiau.

Meniu ir dialoginiai langai

Swing paketo meniu kūrimui skirto klasės turi savo analogus AWT atveju. Pačioje pradžioje reikia sukurti JMenuBar objektą, kuris sukurią meniu elementams skirtą juostelę. Meniu juostelėje atskiri meniu elementai papildomi JMeniu klasės objektais. Apskritai "J" raide labai dažnai skiriasi Swing ir AWT analogiškų klasių pavadinimai. Meniu punktai yra kuriami su paketo javax.swing paketo objektu JMenuItem. Vienas Swing privalumų yra, kad meniu punkto tekstą galima patalpinti pasirinktame paveiksliuke arba naudoti vien paveikslėlį be teksto. AWT atveju punktuose panaudoti paveikslėlių negalima. Taigi Swing atveju yra trys meniu punktų konstruktoriai:

JMenuItem(String tekstas); JMenuItem(Icon vaizdelis); JMenuItem(String tekstas,Icon vaizdelis);

Vien šis Swing privalumas gana svarus argumentas už Swing panaudojimą grafinės aplinkos kūrimui. Yra rekomenduojama Icon objektuose naudoti nelabai aukštos rezoliucijos vaizdelius, nes meniu punktams iliustruoti nėra prasmės eikvoti daug kompiuterinių resursų, kurių pareikalauja aukštos kokybės grafika.

Taigi JMenuBar, JMenu ir JMenuItem yra trijų lygmenų smulkėjimo tvarka išvardinti meniu konstrukcijos elementai. Kaip ir AWT atveju, pirma yra sukuriami meniu objektai, o vėliau jie patalpiname panaudojant add() metodą. Tokiu būdu su add() panaudojimu jūs valdote meniu elementų išdėstymo tvarką. Jei JMenu punktas bus JMenu objektas, tai tas punktas atidarys žemesnio lygmens naują meniu. Tokiu būdu yra kuriami daugelio lygių sudėtiniai meniu.

Keikvieną JMenuItem objektą galima papildyti pagalbiniu tekstu (angl. techninis Java terminas - ToolTipText, skirtu trumpai informuoti vartotoją apie meniu punkto paskirtį. Pagalbinis meniu punkto tekstas pasirodo, kai vartotojas užlaiko dėmesį su pelės žymekliu prie pasirinkto meniu punkto. Pagalbinis tekstas yra suformuojamas meniu punkto objekto metodu setToolTipText(String pagalbinisTekstas).

Suformuota meniu eilutė yra talpinama į Swing paketo objektą JFrame panaudojant setJMenuBar() metodą. Metodu parametru yra perduodamas suformuotas JMenuBar objektas. JFrame yra Swing rėmelis (langelis ekrane) analogiškas Frame AWT rėmeliui.

Swing meniu įvykių apdorojimas yra visiškai analogiškas AWT meniu įvykių apdorojimui. Taip yra todėl, kad yra naudojamos tos pačios įvykių apdorojimui skirtos klasės. Pavyzdžiui meniu punkto pasirinkimas generuoja ActionEvent klasės tipo įvykį, kurio apdorojimas organizuojamas panaudojant ActionListener interfeisą. Tačiau ir čia egzistuoja tam tikras skirtumas Swing naudai. Tiksliau Swing atveju meniu punktų komandas galima pasirinkti ir su karštaisiais klavišais, kurie yra pakete javax.swing.element apibrėžiami MenuKeyEvent įvykiai.

Swing ir AWT dialoginiai langai pasižymi labiau esminiais skirtumais, nei aptarti meniu kūrimo ypatumai. Pavyzdžiui javax.swing pakete apibrėžta klasė JOptionPane klasė, skirta informuoti arba įvesti vartotojo duomenis. Šioje klasėje yra keturi metodai, kurie sukuria dialoginius langus, skirtus įvesti skirtingo stiliaus informaciją. Išvardinsime šiuos keturis metodus:

Vaiz
de
lis
Pranešimo
tekstas
Reikšmių įvedimas
Komandų mygtukai

7 - 1. JOptionPane objekto struktūrinė schema

7.1 brėžinyje pavaizduota JOptionPane objekto struktūrinė schema, kuri schematiškai pavaizduoja dialoginiame lange atskirų elementų išdėstymo sritis. Kairiame viršutiniame kampe talpinamas nedidelis vaizdelis grafiškai iliustruojantis dialoginio lango paskirtį, pavyzdžiui šauktuką, klaustuką, pranešimą apie klaidas ir pan. Dešiniau grafinės informacijos talpinama vartotoją informuojantis tekstas, žemiau - vartotojo informacijai įvesti skirta sritis ir pačioje apačioje - komandiniai mygtukai, pavyzdžiui trijų mygtukų serija: "Taip/Ne/Atsisakau".

Swing technologijoje yra naujas ją skiriantis nuo AWT elementas, kurio angl. techninis terminas yra look&feel. Jo esmė yra ta, kad visoje grafinėje vartotojo aplinkoje yra vartojamas vieningas stilius, kurį galima nesunkiai pakeisti derinant stilių pavyzdžiui pagal Windows ar Unix operacinėse sistemose nusistovėjusius stilius. Stilių galima keisti programos vykdymo eigoje panaudojant vieną metodą ir tai suteikia programuotojui naujas ir lengvai realizuojamas galimybes. look&feel iliustracijai pateiksime JOptionPane objekto vaizdavimo stiliaus parametrus:

Meniu ir dialoginių langų kūrimo iliustracijai pateiksime pavyzdį klasės, kuri sukuria menius su komandų punktais iliustruojančiais įvairios paskirties bei įvairaus stiliaus (lookųfeel) JOptionPane objektus.

// Swing meniu ir JOptionPane įvairių stilių // iliustravimo klasė // Reikalingi paketai import javax.swing.*; import java.awt.event.*; // Klasės SwingMeniu pradžia public class SwingMeniu extends JFrame implements ActionListener{ // Standartiškai java.exe paleidžiamas pirmuoju metodas public static final void main (String[] Args){ new SwingMeniu("Meniu su dialoginiais langais"); } // SwingMeniu klasės konstruktorius public SwingMeniu(String antraste){ super(antraste); sukurkMeniu(); setSize(500,300); show(); } //SwingMeniu konstruktorius // meniu punktų kintamieji ir sukūrimo metodas JMenuItem klaida,informacija,perspejimas,klausimas,taipNe,ivedimas; public void sukurkMeniu(){ JMenuBar juosta = new JMenuBar(); JMenu pranesimai = new JMenu("Pranesimai"); klaida = new JMenuItem("Klaida"); klaida.setToolTipText("Pranesimas ERROR_MESSAGE"); klaida.addActionListener(this); pranesimai.add(klaida); perspejimas = new JMenuItem("Perspejimas"); perspejimas.setToolTipText("Pranesimas WARNING_MESSAGE"); perspejimas.addActionListener(this); pranesimai.add(perspejimas); informacija = new JMenuItem("Informacija"); informacija.setToolTipText("Pranesimas INFORMATION_MESSAGE"); informacija.addActionListener(this); pranesimai.add(informacija); klausimas = new JMenuItem("Klausimas"); klausimas.setToolTipText("Pranesimas QUESTION_MESSAGE"); klausimas.addActionListener(this); pranesimai.add(klausimas); JMenu patvirtinimai = new JMenu("Patvirtinimai"); taipNe = new JMenuItem("Taip/Ne patvirtinimas"); taipNe.setToolTipText("Pranesimas YES_NO_CANCEL_OPTION"); taipNe.addActionListener(this); patvirtinimai.add(taipNe); ivedimas = new JMenuItem("Ivedimo dialogas"); ivedimas.setToolTipText("Ivedimo dialogo langas"); ivedimas.addActionListener(this); patvirtinimai.add(ivedimas); // užpildome meniu juostą juosta.add(pranesimai); juosta.add(patvirtinimai); setJMenuBar(juosta); } //sukurkMeniu() // Įvykių apdorojimas // Pagal įvykio generavimo šaltinį vartotojui // vartotojui bus pateikiamas atitinkamas dialoginis langas public void actionPerformed(ActionEvent e){ if (e.getSource()==klaida) JOptionPane.showMessageDialog(this,"Teksto pranesimas","Antraste", JOptionPane.ERROR_MESSAGE); else if (e.getSource()==informacija) JOptionPane.showMessageDialog(this,"Teksto pranesimas","Antraste", JOptionPane.INFORMATION_MESSAGE); else if (e.getSource()==perspejimas) JOptionPane.showMessageDialog(this,"Teksto pranesimas","Antraste", JOptionPane.WARNING_MESSAGE); else if (e.getSource()==klausimas) JOptionPane.showMessageDialog(this,"Teksto pranesimas","Antraste", JOptionPane.QUESTION_MESSAGE); else if (e.getSource()==taipNe) JOptionPane.showConfirmDialog(this,"Teksto pranesimas","Antraste", JOptionPane.YES_NO_CANCEL_OPTION); else if (e.getSource()==ivedimas) JOptionPane.showInputDialog(this,"Teksto pranesimas"); } //actionPerformed } //class SwingMeniu

Programos reakcija į išsirinktą perspėjimo meniu punktą turėtų būti kaip pavaizduota 7.2 piešinyje.

7-2 paveikslėlis. SwingMeniu darbo iliustracija. Kodas SwingMeniu.java

Piktogramų panaudojimas

Kaip jau minėjome vienas Swing privalumų lyginant su AWT analogais yra galimybė grafinės aplinkos elementuose panaudoti grafinius mažus vaizdelius (ikonas, piktogramas). Tokių grafinių elementų panaudojimas praktiškai kiekviename vartotojau aplinkos elemente jau tapo gero programavimo tono stiliumi.

Swing piktogramų apibrėžimas organizuotas Icon interfeisu. Vienas šio interfeiso objektų yra ImageIcon. Šios klasės konstruktoriai yra tokie:

ImageIcon(Image img); ImageIcon(String fileName); ImageIcon(URL location);

ImageIcon objekto parametrai nurodo piktogramos šaltinį. Turint ImageIcon objektą jį galima panaudoti Swing elementuose. Iliustruokime tai pavyzdžiu, kuriame pasiūlysime vartotojui "Atverti" failą panaudojant trijų stilių JButton mygtukus: tekstinį, grafinį ir tekstinį bei grafinį.

// JButton mygtuko įvairių stilių ir // ImageIcon panaudojimo iliustracija // import javax.swing.*; import java.awt.*; public class SwingMygtukai extends JFrame{ // java.exe pirmuoju vykdomas metodas public static final void main(String[] args){ // kreipiamės į konstruktorių new SwingMygtukai("3 stiliu Swing mygtukai"); } public SwingMygtukai(String antraste){ super(antraste); // nustatome komponenčių išdėstymo stilių getContentPane().setLayout(new FlowLayout()); // sukuriame ImageIcon objektą // ./Ikonos pakatalogyje turime patalpinti open.gif paveikslėlį ImageIcon atvertiIkona = new ImageIcon("./ikonos/open.gif"); //apibrėžiame mygtukų objektus JButton atverti = new JButton("Atverti"); JButton imgAtverti = new JButton(atvertiIkona); JButton imgTxtAtverti = new JButton("atverti",atvertiIkona); // sudedame mygtukus į rėmelį getContentPane().add(atverti); getContentPane().add(imgAtverti); getContentPane().add(imgTxtAtverti); // paviesiname Swing mygtukus setSize(300,200); show(); } //SwingMygtukai konstruktorius } //class SwingMygtukai

7-3 paveikslėlis. SwingMygtukai darbo iliustracija. Kodas SwingMygtukai.java

Atkreipkite dėmesį, Swing paketo JFrame langas pridedant objektus naudoja getContentPane() metodą, kuris grąžina nuorodą į rėmelio konteinerį. Ir kiti Swing objektai yra pridedami panaudojant getContentPane() metodą.

Įrankių rinkinys JToolBar

Įrankių lentelė dažniausiai talpinama žemiau rėmelio meniu eilutės. Šioje lentelėje dominuoja grafinėmis piktogramomis vaizduojami komandų mygtukai. Tokių mygtukų kūrimą mes ką tik aptarėme. Įrankių lentelei kurti skirta javax.swing paketo JToolBar klasė. Ši klasė turi du konstruktorius:

JToolBar(); JToolBar(int kryptis);

Sveikasis krypties parametras gali nurodyti horizontalią (JToolBar.HIRIZONTAL) arba vertikalią (JToolBar.VERTICAL) mygtukų išdėstymo orientaciją. Nutylimoji yra horizontali orientacija, o vertikalią galima apibrėžti tokiu būdu:

JToolBar irankiai = new JToolBar(JToolBar.VERTICAL);

JToollBar sudaroma iš JButton elementų, kurie, kaip įprasta, patalpinami panaudojant add() metodą. Pateiksime įrankių lentelės skirtos darbui su failais maketą. Pavyzdyje taip pat bus panaudota daugeliui dirbančių su failais java programų naudinga klasė JFileChooser.

// Įrankių lentelės (juostelės) JToolBar, analogiško meniu // ir failo išsirinkimo dialogo JFileChooser panaudojimo iliustracija // import javax.swing.*; import java.awt.*; import java.awt.event.*; // klasės pradžia public class SwingIrankiai extends JFrame implements ActionListener{ // java.exe pirmuoju vykdomas metodas public static final void main(String[] args){ // kreipiamės į klasės konstruktorių new SwingIrankiai("Irankiu juostele"); } //main // klasės viešieji kintamieji public JMenuItem atvertiFaila,issaugotiFaila; public JButton naujas,atverti,issaugoti,perziureti,spausdinti; public JFileChooser issirinktiFaila; // darbo su failu meniu sukūrimo metodas public void sukurkMeniu(){ JMenuBar juosta = new JMenuBar(); JMenu failas = new JMenu("Failas"); failas.add(new JMenuItem("Naujas")); atvertiFaila = new JMenuItem("Atverti"); atvertiFaila.addActionListener(this); failas.add(atvertiFaila); issaugotiFaila = new JMenuItem("Issaugoti"); issaugotiFaila.addActionListener(this); failas.add(issaugotiFaila); failas.add(new JMenuItem("Perziura")); failas.add(new JMenuItem("Spausdinti")); juosta.add(failas); setJMenuBar(juosta); } //sukurkMeniu() // klasės konstruktorius public SwingIrankiai(String antraste){ // kreipiamės į paveldėtą JFrame konstruktorių super(antraste); // nurodome kelią, kuriame bus saugojamos piktogramos (ikonos) String kelias2ikonos="./ikonos/"; // sukuriame meniu sukurkMeniu(); // nurodome išdėstymą rėmėlyje getContentPane().setLayout(new BorderLayout()); // sukuriame irankiu juosteles objekta JToolBar irankiai = new JToolBar(); // sukuriame valdymo mygtuku objektus naujas = new JButton(new ImageIcon(kelias2ikonos+"new.gif")); naujas.setToolTipText("Naujas failas"); naujas.addActionListener(this); irankiai.add(naujas); atverti = new JButton(new ImageIcon(kelias2ikonos+"open.gif")); atverti.setToolTipText("Atverti faila"); atverti.addActionListener(this); irankiai.add(atverti); issaugoti = new JButton(new ImageIcon(kelias2ikonos+"save.gif")); issaugoti.setToolTipText("Issaugoti faila"); issaugoti.addActionListener(this); irankiai.add(issaugoti); perziureti = new JButton(new ImageIcon(kelias2ikonos+"preview.gif")); perziureti.setToolTipText("Spausdinimo perziura"); perziureti.addActionListener(this); irankiai.add(perziureti); spausdinti = new JButton(new ImageIcon(kelias2ikonos+"print.gif")); spausdinti.setToolTipText("Spausdinti faila"); spausdinti.addActionListener(this); irankiai.add(spausdinti); // patalpiname įrankių juostelę getContentPane().add(irankiai,BorderLayout.NORTH); // ir teksto sritį getContentPane().add(new JTextArea(),BorderLayout.CENTER); // pateikiame rėmelį darbui setSize(500,350); show(); } //SwingIrankiai // įvykių apdorojimo metodas public void actionPerformed(ActionEvent e){ if ((e.getSource()==atvertiFaila)||(e.getSource()==atverti)){ issirinktiFaila = new JFileChooser(); issirinktiFaila.showOpenDialog(this); } else if ((e.getSource()==issaugotiFaila)||(e.getSource()==issaugoti)){ issirinktiFaila = new JFileChooser(); issirinktiFaila.showSaveDialog(this); } } //actionPerformed } //class SwingIrankiai

Atkreipkite dėmesį, kad įrankių juostelės mygtukai apibrėžiami papildomai panaudojant aiškinamojo teksto metodą ToolToiText. Toks panaudojimas čia ypač pageidaujamas, nes mygtukai buvo kuriami tik su piktograma ir todėl vartotojui gali kilti problemų interpretuojant piktograma perteikiamą mygtuko paskirtį. Čia kaip ir anksčiau įvykiai apdorojami su java.awt paketo klasėmis.

7-4 paveikslėlis. SwingIrankiai priėjimo prie katalogų ir teksto srities panaudojimo iliustracija. Kodas SwingIrankiai.java

Šioje programoje patogūs "Atverti" ir "Issaugoti" myktukai, nes jie inicijuoja JFileChooser dialogą, skirti pateikti informaciją apie vartotojo katalogus ir juose esančius failus. Atkreipkite dėmesį, kad rašydami įskiepį negalėsite panaudoti JFileChooser dialogą dėl įskiepiams taikomų saugumo apribojimų.

Srities išskaidymo klasė JSplitPane

Swing paketas turi srities išskaidymo į atskiras dalis klasę. Išskaidomos į dalis srities pavyzdžiu gali būti rėmelio langas. Išskaidymo klasė vadinasi JSplitPane ir yra patalpinta javax.swing pakete. Šiame skyrelyje paanalizuosime JSplitPane ir objekto apibrėžiamo

JScrollPane(Component view);

konstruktoriumi panaudojimą.

Išskaidymo kryptis gali būti vertikali ir horizontali. Pavyzdžiui vertikalią kryptį galime apibrėžti taip:

JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT);

Sritys į kurias išskaidomas rėmelis yra JPanel tipo objektai. Todėl pirma juos reikia sukurti ir vėliau panaudoti nurodant suskaidymo sritis. Pavyzdžiui panaudojus vertikalų išskaidymą JPanel objektas patalpintas su setTopComponent() metodu bus viršutinėje dalyje, o su setBottomComponent() - apatinėje dalyje.

Turint JSplitPane objektą galima nurodyti suskaidymo linijas su šios klasės setDividerLocation() metodu. Po to JSplitPane objektą reikės patalpinti komponente (pavyzdžiui, JFrame lange). Patalpinimui yra naudojami JFrame klasės metodas setContentPane().

Pasižiūrėkime JSplitPane panaudojimo pavyzdį. Jame rėmelis išskaidomas į dvi dalis, kuriose išdėstomi skirtingi Swing valdymo elementai.

// Išskaidymo JSplitPane panaudojimo pavyzdys // import javax.swing.*; import java.awt.*; import java.awt.event.*; // klasės pradžia public class SwingSplitter extends JFrame implements ActionListener{ // java.exe pirmuoju vykdomas metodas public static final void main(String[] args){ // kreipiamės į klasės konstruktorių new SwingSplitter("Remelio padalinimas i dvi dalis"); } //main // klasės viešieji kintamieji public JRadioButton rb1,rb2,rb3,rb4; public JCheckBox keisti; public JPanel antras; // klasės konstruktorius public SwingSplitter(String antraste){ // kreipiamės į paveldėtą JFrame konstruktorių super(antraste); // apibrėžiame viršutinę dalį JPanel pirmas = new JPanel(); // ir užpildome ją valdymo elementais keisti = new JCheckBox("Ar keisti?"); pirmas.add(keisti); pirmas.setToolTipText("Virsutine dalis"); // apibrėžiame apatinę dalį antras = new JPanel(); // ir užpildome ją valdymo elementais ButtonGroup bgr = new ButtonGroup(); rb1 = new JRadioButton("Raudona"); rb1.addActionListener(this); rb2 = new JRadioButton("Melyna"); rb2.addActionListener(this); rb3 = new JRadioButton("Geltona"); rb3.addActionListener(this); rb4 = new JRadioButton("Zalia"); rb4.addActionListener(this); bgr.add(rb1); bgr.add(rb2); bgr.add(rb3); bgr.add(rb4); antras.add(rb1); antras.add(rb2); antras.add(rb3); antras.add(rb4); antras.setToolTipText("Apatine dalis"); JSplitPane spl = new JSplitPane(JSplitPane.VERTICAL_SPLIT); spl.setTopComponent(pirmas); spl.setBottomComponent(antras); spl.setDividerLocation(70); setContentPane(spl); // pateikiame rėmelį darbui setSize(500,350); show(); } //SwingSplitter // Įvykių apdorojimo metodas. // Jei pažymėtas keisti langelis, // pagal pasirinktą pirmoje dalyje spalvą // apibrėžiama antros dalies fono spalva public void actionPerformed(ActionEvent e){ if (keisti.isSelected()) if (e.getSource()==rb1) antras.setBackground(Color.red); else if (e.getSource()==rb2) antras.setBackground(Color.blue); else if (e.getSource()==rb3) antras.setBackground(Color.yellow); else if (e.getSource()==rb4) antras.setBackground(Color.green); } //actionPerformed } //class SwingSplitter

Atkreipkite dėmesį, pirmas ir antras Panel objektams nurodyti pasirodantys ToolTipText aiškinamieji tekstai. Tai tipinis atvejis, nes vartotoją reikia informuoti apie rėmelio suskaidymą panaudojant JSplitePane objektą. Pateiktame pavyzdyje buvo panaudoti nauji Swing paketo objektai: JCheckBox ir JRadioButton. JCheckBox galimi konstruktoriai:

JCheckBox(String tekstas); JCheckBox(String tekstas, boolean selected); JCheckBox(String tekstas, Icon icon); JCheckBox(String tekstas, Icon icon, boolean selected);

tekstas užrašomas šalia išsirinkimo žymės, icon yra piktogramos parametras, selected pažymi ar išsirenkamasis elementas pasirinktas (nutylimji reikšmė - false).

JRadioButton objektas suteikia galimybę organizuoti išsirinkimą iš grupės, t.y. kai iš visų galimų grupės elementų pasirenkamas vienas. Šios klasės konstruktoriai yra analogiški JCheckBox:

JRadioButton(String tekstas); JRadioButton(String tekstas, boolean selected); JRadioButton(String tekstas, Icon icon); JRadioButton(String tekstas, Icon icon, boolean selected);

Kad apjungti JRadioButton elementus į grupę naudojamas klasės ButtonGroup objektas, kuris JRadioButton objekte patalpinamas su tos klasės add() metodu.

Pasirinkus JRadioButton objektą, generuojamas veiksmo (action) įvykis, kurio apdorojimas organizuojamas panaudojant ActionListener interfeisą. Iliustracijai pavyzdyje buvo keičiama antrosios (apatinės) dalies fono spalva pagal pasirinktą pirmojoje (viršutinėje) rėmelio dalyje spalvą.

Taip pat buvo panaudotas paprasčiausias Swing elementas JLabel, skirtas užrašyti rėmelio dalyje nurodytą tekstą. Tačiau, skirtingai nuo AWT analogo Label, JLabel gali panaudoti piktogramą ir užrašyti tekstą nurodyta kryptimi.

7-5 paveikslėlis. SwingSplitter darbo rezultato iliustracija. Kodas SwingSplitter.java

Tabuliuotos drobės JTabbedPane

Tabuliuotos drobės (angl. pane) sudarytos iš atskirų drobių, kurių kiekviena turi antraštę, kurios išsirinkimas aktyvuoja drobę su išsirinkta antrašte. Vienu metu gali būti aktyvuota tik viena drobė.

Tabuliuotos drobės javax.swing pakete aprašytos JTabbedPane klasėje. Sukūrus šio tipo objektą į Panel klasės objektą jis patalpinamas su addTab() metodu. Šio metodo sintaksė yra tokia:

addtab(String title, Component component); addtab(String title, Icon icon, Component component); addtab(String title, Icon icon, Component component, String tip);

Čia title yra antraštės tekstas, component mūsų atveju Panel komponentė, icon - piktograma, tip - pasirodantis aiškinamasis tekstas.

Pateiksime JTabbedPane panaudojimą iliustruojantį pavyzdį. Į JTabbedPane patalpinsime tris drobes (Panel), kuriose bus talpinami valdymo elementai. Kiekviena drobė bus apibrėžta atskiroje klasėje. Taip padaryta vardan kodo aiškumo.

// Iškrentamų drobių klasės JTabbedPane panaudojimo pavyzdys import javax.swing.*; import java.util.*; public class SwingJTabbedPane extends JFrame{ public SwingJTabbedPane(String antraste){ super("JTabbedPane objekto iliustracija"); JTabbedPane tabPane = new JTabbedPane(); tabPane.addTab("Pasijungimas",new ConnectPanel()); tabPane.addTab("Parametrai",new ParamPanel()); tabPane.addTab("Apie programa", new ImageIcon("help.gif"), new AboutPanel(), "trumpa informacija apie programa"); getContentPane().add(tabPane); setSize(400,300); show(); } public static final void main(String[] args){ new SwingJTabbedPane("JTabbedPane iliustracija"); } } //class SwingJTabbedPane class ConnectPanel extends JPanel{ public ConnectPanel(){ add(new JLabel("Vartotojo vardas:")); JTextField vartotojas = new JTextField(20); add(vartotojas); add(new JLabel("Slaptazodis:")); JPasswordField psw = new JPasswordField(15); add(psw); } }//ConnectPanel class ParamPanel extends JPanel{ public ParamPanel(){ add(new JLabel("Profilio pasirinkimas:")); JComboBox cmb = new JComboBox(); cmb.addItem("Rytai"); cmb.addItem("Skambinti"); cmb.addItem("Telekomas"); cmb.addItem("Tele2"); add(cmb); add(new JLabel("Modemo modelio pasirinkimas:")); Vector modems = new Vector(); modems.addElement("Acer 14.4 Data Fax Voice"); modems.addElement("AT&T DATAPort 2001"); modems.addElement("Compaq PCMCIA 144"); modems.addElement("GVC External 28800 Fax Modem"); modems.addElement("ZyXEL Fax Voice U-1496 Plus"); JList lst = new JList(modems); add(lst); } }//ParamPanel class AboutPanel extends JPanel{ public AboutPanel(){ add( new JLabel(new ImageIcon("connect.gif"))); add( new JLabel("Dialoginio lango sudaryto"+ " is iskrentamu drobiu pavyzdys")); } } //class AboutPanel

7-6 paveikslėlis. JTabbedPane darbo iliustracija. Kodas SwingJTabbedPane.java

Pateiktame pavyzdyje yra naujų Swing paketo elementų. JTextField ir JPasswordField sveikasis parametras nurodo šių laukų ilgį matuojamą simbolių skaičiumi. JPasswordField skiriasi nuo JTextField tuo, kad pirmajame įvesti simboliai ekrane vaizduojami "*". Taip yra patogu, kai reikia maskuoti įvedamą slaptažodį.

7-7 paveikslėlis. JPasswordField ir JTextField iliustracija.

Pasijungimo drobėje panaudoti JCombBox ir JList elementai. JCombBox klasė skirta sudaryti išsirenkamajį sąrašą, kurio elementai apibrėžiami su addItem() metodu. JList suteikia galimybę vaizduoti keletą savo elementų. Šio sąarošo formavimui panaudojome java.util Vector klasę, nes ji patogi formuoti sąrašą nenurodinėjant iš anksto nežinomo elementų skaičiaus.

7-8 paveikslėlis. JCombBox ir JList elementų iliustracija.

Trečioje drobėje patalpinome grafinį help tekstą (piktogramą) ir trumpą paaiškinamąjį tekstą "Apie programą".

7-9 paveikslėlis. JLabel su piktograma ir tekstu iliustracija.

JSlider ir JProgressBar panaudojimas paskelbti būseną

JSlider Swing paketo objektas leidžia išsirinkti reikšmę iš intervalo slenkant intervalo tašką. Šį standartinį grafinės aplinkos objektą vadinsime slanksniuote. 7.10 paveikslėlyje parodyta kaip atrodo slanksniuotė. Slanksniuotės konstruktorius atrodo taip:

JSlider(int min, int max);

min ir max reikšmės nurodo intervalą iš kurio slanksniuote išsirenkama skaičiaus reikšmė.

Slanksniuote apibrėžiamą reikšmę galima keisti arba pelės žymekliu keičiant slanksniuotės taško žymeklio padėtį arba programiniu būdu panaudojant JSlider metodą setValue(). Slanksniuotės taško reikšmei rasti naudojamas getValue() metodas.

Keičiant slanksniuotės žymeklio padėtį generuojamas Swing ChangeEvent įvykis. Kad šį įvykį perimti apdorojimui reikia klasėje, kurioje apibrėžiamas JSlider objektas, paskelbti ChangeListener interfeiso realizaciją. Šiame interfeise yra tik vienas metodas stateChanged(), kuriam ir yra perduodamas ChangeEvent klasės kintamasis.

javax.swing pakete taip pat yra JProgressBar objektas, skirtas informuoti apie kokio nors proceso vykdymo eigą. 7.10 paveikslėlyje šis objektas patalpintas apačioje. JProgressBar objekto konstruktorius identiškas slanksniuotės konstruktoriui:

JProgressBar(int min, int max);

JProgressBar objekto einamoji reikšmė apibrėžiama ir nuskaitoma su setValue() ir getValue() metodais

Pateiksime JSlider ir JProgressBar objektų panaudojimo pavyzdį. Pavyzdyje išskirsime giją Thread, kuri kas sekundę atnaujins JProgressBar reikšmę. Kai JProgressBar reikšmė pasieks JSlider reikšmę, giją nutrauksime. Jei JSlider reikšmė pasikeis, JProgressBar einamajai reikšmei priskirsime nulį ir kas sekundę ją keisime, kol ji nepasieks JSlider reikšmės.

// JSlider ir JProgressBar panaudojim pavyzdys import javax.swing.*; import javax.swing.event.*; import java.awt.*; public class SwingSlanksniuote extends JFrame implements Runnable, ChangeListener{ // klasļs kintamieji JSlider sln; JProgressBar prgjst; boolean flag=true; JLabel lbl; int i=0; // paleidziame programa vykdyti public static void main (String[] Args){ new SwingSlanksniuote(); } //slanksniuotļs pokyĶio ßvykio apdorojimas public void stateChanged(ChangeEvent e){ prgjst.setValue(0); prgjst.setMaximum(sln.getValue()); i=0; } // klasļs konstruktorius public SwingSlanksniuote(){ super("JSlider ir JProgressBar"); prgjst = new JProgressBar(0,100); prgjst.setValue(0); sln = new JSlider(0,100); sln.setValue(50); sln.addChangeListener(this); lbl = new JLabel(); lbl.setHorizontalAlignment(SwingConstants.CENTER); getContentPane().setLayout(new BorderLayout()); getContentPane().add(prgjst,BorderLayout.SOUTH); getContentPane().add(lbl,BorderLayout.CENTER); getContentPane().add(sln,BorderLayout.NORTH); setSize(320,80); show(); // apibrļ_iame gijÓ Thread g = new Thread(this); g.start(); try{ g.join(); } catch (InterruptedException e){} // uzbaigiame darba dispose(); System.exit(0); } // gijos atliekami veiksmai public void run(){ while (flag){ prgjst.setValue(i); lbl.setText(Integer.toString(i)); if (prgjst.getValue()==sln.getValue()) flag=false; i++; // sekunde laukiame try{ Thread.sleep(1000); } catch (InterruptedException e){} } //while (flag) } //run } //SwingSlanksniuote

7-10 paveikslėlis. SwingSlanksniuote darbo iliustracija. Kodas SwingSlanksniuote.java

Programos darbo rezultato pavyzdys pateiktas 7.10 paveikslėlyje. Kiekvieną sekundę bus atnaujinama JProgressBar reikšmė. Kai šio objekto reikšmė pasieks JSlider reikšmę, programa užbaigs darbą.

JTable lentelė ir drobės persuka

Drobės persuka naudojama parodyti norimą objekto dalį drobei išskirtame lange, kai visas drobės turinys tame lange netelpa. Šį elementą jūs dažnai naudojate naršydami Internete, kai iškviestas puslapio turinys netelpa naršyklei skirtame lange. Persuka gali būti vertikali, kai drobės aukštis viršija lango aukštį ir horizontali, kai drobės plotis viršiją išskirto lango plotį.

Drobės persuka atliekama su javax.swing objektu JScrollPane. Jo konstruktoriai atrodo taip:

JScrollPane(Component view); JScrollPane(Component view, int vModa, int hModa);

view čia žymi komponentę, kuriai skirtas persukos objektas, vModa ir hModa detalizuoja kokiomis kryptimis reikia persukos.

Persukos panaudojimo strategija nurodoma tokiomis JScrollPane konstantomis:

JTable objektas tinka pavyzdžiu objekto, kurį tikslinga talpinti JScroolPane persukos objekte. JTable yra skirta duomenų lentelei. Jei lentelė yra didelė, vaizduojami duomenys gali netilpti šiam objektui skirtame lange. Tokiu atveju JTable lentelę geriau talpinti JScroolPane objekte, kuris suteiks vartotojui interaktyvias priemones visos lentelės peržiūrai.

JTable konstruktorius atrodo taip:

JTable( Object[][] tableData, Object[] headerNames);

Čia tableData dvimatis lentelės duomenų masyvas, o headerNames - vienmatis masyvas, kuriame talpinamos lentelės stulpelių antraštės. tableData stulpelių skaičius turi sutapti su headerNames ilgiu.

Pateiksime JScrollPane ir JTable panaudojimo pavyzdį. Lentelėje patalpinsime šakninio katalogo failų sąrašą, nurodydami failo pavadinimą, dydį ir tipą.

// JScrollPane ir JTable panaudojimo iliustracija import javax.swing.*; import java.io.*; public class SwingLentele extends JFrame{ // pateikiame lentelę public static void main (String[] args){ new SwingLentele("JTable ir JScrollPane iliustracija"); } // klasės kintamieji Object[][] data; String[] antraste = {"Vardas","Dydis","Tipas"}; // klasės konstruktorius public SwingLentele(String lentelesVardas){ super(lentelesVardas); File f = new File("./"); File[] fl = f.listFiles(); data = new Object[fl.length][3]; // užpildome lentelės duomenų masyvą String ktl="", nesk="neskaitomas", neras="nerasomas", pasl="pasleptas"; for (int i=0; i<fl.length; i++){ data[i][0]=fl[i].getName(); if (fl[i].isDirectory()) data[i][1]=ktl; else{ data[i][1] = Long.toString(fl[i].length()); String S=""; if (!fl[i].canRead()) S+=" "+nesk; if (!fl[i].canWrite()) S+=" "+neras; if (fl[i].isHidden()) S+=" "+pasl; data[i][2] = S; } }//for // sukuriame lentelę ir patalpiname ją JScrollPane objekte JTable lnt = new JTable(data,antraste); JScrollPane prsk = new JScrollPane(lnt); // peteikiame remeliui getContentPane().add(prsk); setSize(500,300); show(); } //SwingLentele konstruktorius } //SwingLentele klasė

7-11 paveikslėlis. Šiame paveikslėlyje matote SwingLentele darbo rezultato pavyzdį. Kodas SwingLentele.java

Elementų hierarchija JTree objekte

Medis yra hierarchinės struktūros elementų rinkinys, kurio struktūrą nesunku pavaizduoti grafiškai. Medžio objekto elementai grupuojami viršūnėse. Pasirinkus viršūnę, jos turinys atsiskleidžia pavaizduojant jai priklausančius elementus.

javax.swing JTree klasė skirta medžiui, o medžio apdorojimui naudojamas javax.swing.tree paketas.

Sukūrus JTree objektą, reikia užpildyti jo elementus. Tai galima padaryti su javax.swing.tree paketo objekto DefaultMatableTreeNode add() metodu.

Kad gauti pasirinktą medžio elementą, naudojamas javax.swing.tree objektas TreePath. TreePath objektas gaunamas su JTree objekto getSelectionPath() metodu. TreePath klasėje yra taip pat getPathComponent() metodas, kuris suranda objektą pagal nurodytą peržiūros indeksą.

Pateiksime JTree panaudojimo pavyzdį. Pasirinkus su pelės žymekliu medžio elementą, rėmelio pavadinimas bus pakeičiamas išsirinkto elemento pavadinimu.

// JTree panaudojimo pavyzdys import javax.swing.*; import javax.swing.tree.*; import java.awt.event.*; class SwingMedis extends JFrame implements MouseListener{ // pateikiame medß public static void main (String[] args){ new SwingMedis("JTree iliustracija",6,5); } // klasļs kintamieji JTree medis; int kursu,grupiu; public String[] kursai = {"I","II","III","IV","I mag","II mag"}; public String grupe = "gr"; public String[] grupes; public String[] vardai = {"Jonaitis","Petraitis","Martynaitis", "Kliauza","Sabonis","Kazlaukas","Brazys","Ungurys", "Pavalkis","Girnius","Naujokaitis","Tamulaitis", "Jonaityte","Petraityte","Martynaityte", "Kliauzyte","Sabonyte","Kazlaukaite","Brazaute","Unguryte", "Pavalkyte","Girniute","Naujokaityte","Tamulaityte"}; // klasės konstruktorius public SwingMedis(String fakultetas,int kursu, int grupiu){ super(fakultetas); if (kursu>kursai.length) System.err.println("Per daug kursu"); grupes = new String[grupiu]; for (int j=0; j<grupiu; j++) grupes[j]=Integer.toString(j+1)+" "+grupe; DefaultMutableTreeNode fak = new DefaultMutableTreeNode(fakultetas); this.kursu = kursu; this.grupiu = grupiu; DefaultMutableTreeNode[] k = new DefaultMutableTreeNode[kursu]; DefaultMutableTreeNode[][] g = new DefaultMutableTreeNode[kursu][grupiu]; for (int i=0; i<kursu; i++){ k[i] = new DefaultMutableTreeNode(kursai[i]); for (int j=0; j<grupiu; j++){ g[i][j] = new DefaultMutableTreeNode(grupes[j]); int N=vardai.length/3+(int)(Math.random()*vardai.length/3); for (int n=0; n<N; n++) g[i][j].add(new DefaultMutableTreeNode (vardai[(int)(Math.random()*vardai.length)])); k[i].add(g[i][j]); } fak.add(k[i]); } // sukuriame medį ir persukos langą medis = new JTree(fak); medis.addMouseListener(this); JScrollPane prs = new JScrollPane(medis); getContentPane().add(prs); setSize(250,300); show(); } //SwingMedis konstruktorius // Įvykių apdorojimas public void mouseClicked(MouseEvent e){ TreePath trp = medis.getSelectionPath(); if (trp!=null){ int i=trp.getPathCount()-1; setTitle(trp.getPathComponent(i).toString()); } } public void mousePressed(MouseEvent e){} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} } //class SwingMedis

7-12 paveikslėlis. Šiame paveikslėlyje matote SwingMedis darbo rezultato pavyzdį. Kodas SwingMedis.java

Swing Interneto naršyklės pavyzdys

Pabaigai pateiksime kiek sudėtingesnį Swing panaudojimo pavyzdį, skirtą pakrauti ir peržiūrėti interneto puslapį, pereiti į hipernuorodas ir kurti pakrautų adresų sąrašą.

// Swing Interneto naršyklės pavyzdys import javax.swing.*; import javax.swing.event.*; import java.net.*; import java.io.*; import java.awt.*; import java.awt.event.*; import java.util.*; class SwingINarsykle extends JFrame implements HyperlinkListener, ActionListener{ // main() metodas, iliustruojantis kaip naudotis SwingINarsykle /* Jei proxy serveris nenaudojamas jūsų kompiuteryje, tris pirmąsias main() metodo eilutes praleiskite */ public static void main(String args[]){ /* Properties prop = System.getProperties(); prop.put("http.proxyHost","proxy.vu.lt"); prop.put("http.proxy.port","8080"); */ // sukuriame klasės naują egzempliorių SwingINarsykle IN = new SwingINarsykle("SwingINarsykle"); } // klasės kintamieji JTextPane webSritis; JTextField adr; public JButton atgal,namo; URL namuURL; String namai = "http://www.vu.lt"; Stack istorija; String antraste = ""; // apdorojame įvykius public void actionPerformed(ActionEvent e){ if (e.getSource()==adr){ try{ istorija.push(new URL(adr.getText())); webSritis.setPage(new URL(adr.getText())); setTitle(antraste+": "+ adr.getText()); } catch (IOException ioe){ System.err.println("adr IO klaida: "+ioe); } } if (e.getSource()==atgal) if (!(istorija.empty())){ try{ webSritis.setPage((URL)istorija.pop()); adr.setText(webSritis.getPage().toString()); setTitle(antraste+": "+webSritis.getPage().toString()); } catch (IOException ioe){ System.err.println("atgal IO klaida: "+ioe); } } if (e.getSource()==namo) setNamai(); }// actionPerformed public void hyperlinkUpdate(HyperlinkEvent e){ if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED){ try{ webSritis.setPage(e.getURL()); adr.setText(e.getURL().toString()); istorija.push(e.getURL()); setTitle(antraste+": "+e.getURL().toString()); } catch (IOException ioe){ System.err.println("hyperlink IO klaida: "+ioe); } } } //hyperlinkUpdate public void setNamai(){ try{ namuURL = new URL(namai); istorija.push(namuURL); adr.setText(namuURL.toString()); setTitle(antraste+": "+namuURL.toString()); webSritis.setPage(namuURL); } catch (IOException ioe){ System.err.println("namu IO klaida: "+ioe); } } //setNamai // klasės konstruktorius public SwingINarsykle(String antraste){ super(antraste); this.antraste = antraste; webSritis = new JTextPane(); istorija = new Stack(); getContentPane().setLayout(new BorderLayout()); JScrollPane prs = new JScrollPane(webSritis); JToolBar irank = new JToolBar(); atgal = new JButton(" Atgal "); atgal.addActionListener(this); namo = new JButton(" Namai "); namo.addActionListener(this); adr = new JTextField(40); adr.addActionListener(this); irank.add(namo); irank.add(atgal); irank.add(adr); webSritis.addHyperlinkListener(this); getContentPane().add(irank,BorderLayout.NORTH); getContentPane().add(prs,BorderLayout.CENTER); webSritis.setEditable(false); // atidarome namų puslapį try{ namuURL = new URL(namai); } catch (MalformedURLException e){ System.err.println("Blogas URL: "+namai+", err: "+e); } istorija.push(namuURL); setNamai(); setSize(700,500); show(); }// SwingINarsykle konstruktorius }// class SwingINarsykle

7-13 paveikslėlis. SwingINarsykle darbo rezultato pavyzdys. Kodas SwingINarsykle.java

Atgal       Wireless Java