Java Programozás 3. Gy: Java GUI Swing, AWT 35/1 B ITv: MAN 2018.02.25
Feladat Készítsük el az Emp osztály kezelő programját úgy, hogy ArrayList-et (listatömb, tömblista, rugalmas tömb) használunk. A java.util.arraylist osztályban található Példányosítani kell ArrayList<típus> = new ArrayList<típus>(); Csak burkoló osztály lehet az elemtípusa Integer, Double, Character, Long, Boolean A lista csak és kizárólag referencia típusú adatokat képes tárolni, így primitív típusokat nem rakhatunk bele. Fontos metódusok: add(), size(), get(index), indexof(érték), tostring() remove(érték), set(index, érték), toarray() 35/2
Feladat Készítsük el az Emp osztály kezelő programját úgy, hogy ArrayList-et (listatömb, tömblista, rugalmas tömb) használunk. Kezdjük a programosztállyal. import java.util.arraylist; public class EmpPrg { private static ArrayList<Emp> emp = new ArrayList<Emp>(); public static void main(string[] args) { emp.add(new Emp("Kis Béla", 250000)); emp.add(new Emp("Jó Zoli", 325000)); emp.add(new Emp("Só Béla Peti", 99000)); emp.add(new Emp("Béla Tomi", 420000)); 35/3
A kód A print metódus kódja az Emp-ben: import java.util.arraylist; public class Emp {... public static void print(arraylist<emp> emp){ System.out.println(""); for (Emp e : emp) System.out.println(e); Hívása az EmpPrg-ben: Emp.print(emp); 35/4
A kód A sortnev metódus kódja az Emp-ben: import java.util.arraylist; Hívása az EmpPrg-ben: import java.util.collections; import java.util.comparator; Emp.sortNev(emp); public class Emp {... public static void sortnev(arraylist<emp> emp){ Collections.sort(emp, new Comparator<Emp>() { public int compare(emp e1, Emp e2) { return e1.nev.compareto(e2.nev); ); print(emp); A { között egy névtelen osztály található, ami implementálja a Comparator interfészt. Az interfész compare metódusát kell felüldefiniálni: a két bemenő 35/5 elemet kell összehasonlítani úgy, hogy int típusú értéket adjon eredményül.
A kód A sortfiz metódus kódja az Emp-ben: import java.util.arraylist; import java.util.collections; import java.util.comparator; public class Emp {... public static void sortfiz(arraylist<emp> emp){ Collections.sort(emp, new Comparator<Emp>() { public int compare(emp e1, Emp e2) { return ); print(emp); e1.fiz - e2.fiz; Hívása az EmpPrg-ben: 35/6 Emp.sortFiz(emp);
A kód A search metódus kódja az Emp-ben: public class Emp {... public static void search(arraylist<emp> emp, String s) { boolean b = false; for (Emp e : emp) if (e.nev.contains(s)) b = true; //if (e.nev.equals(s)) b = true; System.out.println(""); if (b) System.out.println(s+": létezik"); else System.out.println(s+": nem létezik"); Hívása az EmpPrg-ben: 35/7 Emp.search(emp, "Kis Béla");
A kód A searchfirstname metódus kódja az Emp-ben: public class Emp {... public static void searchfirstname(arraylist<emp> emp, String s){ System.out.println(""); for (Emp e : emp) { boolean b = false; String[] n = e.nev.split(" "); for (int j=1; j<n.length; j++) if (n[j].equals(s)) b = true; if (b) System.out.println(s+": "+e.nev); Hívása az EmpPrg-ben: 35/8 Emp.searchFirstName(emp, "Béla");
35/9
Feladat Készítsük el a grafikus felületű "Helló világ" programot. Lépések: 1. A main metódusban példányosítunk egy JFrame-et. 2. Megadjuk a frame helyét, méretét. 3. A frame tartalom elrendezőjét kikapcsoljuk. 4. Készítünk egy feliratot (JLabel). 5. Megadjuk a felirat helyét, méretét. 6. A frame tartalompaneljéhez hozzáadjuk a feliratot 7. Beállítjuk, hogy mi történjen a frame-el, ha bezárjuk az ablakot. 8. Megjelenítjük a frame-et. A program ablaka átméretezhető, tálcára helyezhető, teljes képernyő méretűvé tehető. A program így egyetlen szálon fog futni 35/10
A kód v1 Logika: komponens példányosítása, aztán méretezése, aztán hozzáadása az ablakhoz. x import javax.swing.*; public class HelloGr { public static void main(string[] args) { JFrame Foablak = new JFrame("Grafikus Hello"); Foablak.setBounds(50,50, 260,150); Foablak.getContentPane().setLayout(null); JLabel Felirat = new JLabel("Helló világ"); Felirat.setBounds(30,10, 100,20); Foablak.getContentPane().add(Felirat); y xk yk ym xm Foablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Foablak.setVisible(true); 35/11
Eclipse megoldás (Saját felelősségre!) 35/12
Eclipse megoldás (Saját felelősségre!) 35/13
Eclipse megoldás (Saját felelősségre!) 35/14
Eclipse megoldás (Saját felelősségre!) 35/15
Eclipse megoldás (Saját felelősségre!) 35/16
Eclipse megoldás (Saját felelősségre!) + 35/17
Eclipse megoldás (Saját felelősségre!) 35/18
Eclipse megoldás (Saját felelősségre!) 35/19
A kód v1 (by Eclipse) import java.awt.borderlayout; import java.awt.eventqueue; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.border.emptyborder; import javax.swing.jlabel; public class GraphHello extends JFrame { private JPanel contentpane; /** * Launch the application. */ public static void main(string[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { GraphHello frame = new GraphHello(); frame.setvisible(true); catch (Exception e) { e.printstacktrace(); ); /** * Create the frame. */ public GraphHello() { setdefaultcloseoperation(jframe.exit_on_close); setbounds(100, 100, 275, 196); contentpane = new JPanel(); contentpane.setborder(new EmptyBorder(5, 5, 5, 5)); setcontentpane(contentpane); contentpane.setlayout(null); import javax.swing.*; public class HelloGr { public static void main(string[] args) { JFrame Foablak = new JFrame("Grafikus Hello"); Foablak.setBounds(50,50, 260,150); Foablak.getContentPane().setLayout(null); JLabel Felirat = new JLabel("Helló világ"); Felirat.setBounds(30,10, 100,20); Foablak.getContentPane().add(Felirat); by BitMan Foablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Foablak.setVisible(true); 35/20 JLabel lblnewlabel = new JLabel("Hello World!"); lblnewlabel.setbounds(10, 11, 82, 14); contentpane.add(lblnewlabel);
A kód v2 import javax.swing.*; public class HelloGr2 { private static void createandshowgui() { JFrame Foablak = new JFrame("Grafikus Hello"); JLabel Felirat = new JLabel("Helló világ"); Foablak.getContentPane().add(Felirat); Foablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Foablak.pack(); Foablak.setVisible(true); public static void main(string[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createandshowgui(); ); 35/21
A kód v2 Logika: az alapértelmezett tartalom elrendezőt meghagyjuk, példányosítjuk és pakoljuk a komponenseket, aztán becsomagoljuk az ablakot. pack(): a metódus hívásakor a tartalom elrendező úgy állítja be a komponensek méretét, helyét, hogy minden elférjen a keretben. invokelater(): új szálon indítja el a megadott kódot. Runnable(): interfész, melyet implementálni kell azokban az osztályokban, amelyekben szálkezelést hajtunk végre. run(): ezzel a metódussal indítható el kód az adott szálon. Ha több szálon futó programot írunk, így lehet egy szálat elindítani. Tapasztalat: ha az egyes grafikus komponensek lekezelését végző kódok nem túl idő- és energia igényesek, akkor futhat egyetlen szálon a grafikus program. 35/22
1. 2. 3. 4. 5. 6. 7. 8. A kód v3 import javax.swing.*; public class HelloGr3 extends JFrame { 35/23 public HelloGr3() { settitle("grafikus Hello"); setbounds(50,50, 300,160); //setsize(300, 160); //csak méret megadás //setlocationrelativeto(null); //ablak középre helyezése JPanel dp = new JPanel(); dp.setlayout(null); getcontentpane().add(dp); JLabel jl1 = new JLabel("Helló világ"); dp.add(jl1); jl1.setbounds(20,50, 100,20); public static void main(string[] args) { HelloGr3 hg = new HelloGr3(); hg.setdefaultcloseoperation(jframe.exit_on_close); hg.setresizable(false); hg.setvisible(true);
A kód v3 Logika: 1. A JFrame leszármazottjaként létrehozunk egy osztályt. 2. Megadjuk az ablak nevét, helyét, méretét. 3. Létrehozunk egy JPanel-t. 4. Kikapcsoljuk a panel tartalom elrendezőjét. 5. A panelt hozzáadjuk a frame tartalmához. 6. A panelre rakjuk a komponenseket. 7. Példányosítjuk az osztályt. 8. Letiltjuk a frame méretezhetőségét. A módszer viszonylag egyszerű, a kód átlátható, könnyen módosítható, bővíthető. Az ablak nem méretezhető át, így a tartalom sosem torzul el, mindig értelmezhető marad. 35/24
A kód Szereljünk a panelre egy nyomógombot, funkciója legyen: bezárás. JButton bc = new JButton(); bc.settext("bezár"); dp.add(bc); bc.setbounds(180,48, 80,24); bc.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.exit(0); //==a program leállítása ); 35/25
Eclipse megoldás (Saját felelősségre!) 35/26
Eclipse megoldás (Saját felelősségre!) 35/27
35/28
A kód Rakjunk a panelra egy szövegmezőt, és egy újabb nyomógombot, melynek funkciója: a szövegmezőbe írt adat kiírása egy üzenetpanelre. import java.awt.event.*; import javax.swing.*; public class HelloGr32 extends JFrame { public HelloGr32() { settitle("beolvasó, kiíró példa"); setbounds(50,50, 300,160); JPanel dp = new JPanel(); dp.setlayout(null); this.getcontentpane().add(dp); JLabel jl1 = new JLabel("Írj be valamit!"); dp.add(jl1); jl1.setbounds(20,20, 150,20); 35/29
A kód JTextField adat = new JTextField(""); dp.add(adat); adat.setbounds(20,50, 220,20); JButton ba = new JButton(); ba.settext("kiír"); dp.add(ba); ba.setbounds(60,90, 80,24); ba.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { String s = adat.gettext(); JOptionPane.showMessageDialog(HelloGr32.this, "A beírt adat: "+s, "Üzenet a programtól", 1); ); 35/30
A kód 35/31 JButton bc = new JButton(); bc.settext("bezár"); dp.add(bc); bc.setbounds(160,90, 80,24); bc.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.exit(0); ); //== main vége public static void main(string[] args) { HelloGr32 hg = new HelloGr32(); hg.setdefaultcloseoperation(jframe.exit_on_close); hg.setresizable(false); hg.setvisible(true);
Üzenetpanel JOptionPane.showMessageDialog(T, Ü, F, I) - Üzenetablak megjelenítése. A megjelenő ablak modális, ez kb. azt jelenti, hogy amíg le nem OKézzuk, nem folytathatjuk a főprogram használatát! T - A tulajdonos (most null, vagyis nincs definiálva) Ü A panelen megjelenő üzenet szövege F - A panel címe, felirata (most a globális bm string) I - A panel ikonja (0-Stop, 1-Info, 2-Figyelmeztetés, 3-Kérdés) 35/32
35/33
35/34
VÉGE VÉGE 35/35