Felhasználói eszközök

Eszközök a webhelyen


oktatas:programozas:java:java_gui_swing

Különbségek

A kiválasztott változat és az aktuális verzió közötti különbségek a következők.

Összehasonlító nézet linkje

Előző változat mindkét oldalonElőző változat
Következő változat
Előző változat
oktatas:programozas:java:java_gui_swing [2021/03/03 13:31] – [Felirat] adminoktatas:programozas:java:java_gui_swing [2024/04/16 18:46] (aktuális) – [Külső link] admin
Sor 4: Sor 4:
  
   * **Szerző:** Sallai András   * **Szerző:** Sallai András
-  * Copyright (c) Sallai András2011, 2012, 2013, 2014, 2015, 2016, 2019, 2020 +  * Copyright (c) 2011, Sallai András 
-  * Licenc: GNU Free Documentation License 1.3 +  * Szerkesztve: 2011-2023 
-  * Web: http://szit.hu+  * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] 
 +  * Web: https://szit.hu
  
 ===== Bevezetés ===== ===== Bevezetés =====
  
-Ennek a fejezetnek a megvalósításához feltételezem a Java alapismereteket és a Java  +A fejezet feldolgozásához szükség van a Java nyelv, és a Java OOP ismeretére
-objektumorientált programozási ismereteket+
  
-Joggal kérdezhetjük, hogy miért van még egy grafikus eszközkészlet a Java nyelvben. Ott van az "awt" minek  +Java nyelvbe épített első GUI programozói könyvtár az AWT volt. 
-még a Swing is? +
  
-Az awt programozói eszközkészlet úgy működik, hogy az ablakok a komponensek megjelenítését az+Az AWT programozói eszközkészlet úgy működik, hogy az ablakok a komponensek megjelenítését az
 operációs rendszer ablakkezelőjére bízza, minden operációs rendszeren. Ennek eredménye, hogy  operációs rendszer ablakkezelőjére bízza, minden operációs rendszeren. Ennek eredménye, hogy 
-ugyanaz a program másként néz ki Windowson, Linuxon, MacOSX-en vagy más rendszeren. A Swing +ugyanaz a program másként néz ki Windowson, Linuxon, MacOS-en vagy más rendszeren. A Swing 
 eszközkészletet úgy alakították ki, hogy maga határozza meg hogyan nézzen ki a program ablaka. eszközkészletet úgy alakították ki, hogy maga határozza meg hogyan nézzen ki a program ablaka.
 Így egységes kinézetet kapunk minden operációs rendszeren.  Így egységes kinézetet kapunk minden operációs rendszeren. 
Sor 48: Sor 47:
  
  
 +{{:oktatas:programozas:java:hellovilag_ablak.png|}}
  
 +Alapértelmezetten, amikor a felhasználó kattint a bal felső sarokban a  
 +bezárásra, az ablak ugyan bezáródik, de a program nem. A programot  
 +a terminálablakba kattintva tudjuk leállítani, egy Ctrl+C billentyűkombinációval.
  
  
Sor 60: Sor 62:
 import javax.swing.JFrame; import javax.swing.JFrame;
 </code> </code>
 +A JFrame a javax.swing csomagban található, ezért importálásnál ezt az
 +útvonalat adtuk meg.
  
  
-A programban egy ablak nevű objektumot deklarálunk:+A programban egy ablak nevű objektumot deklarálunk, aminek a típusa JFrame:
 <code java> <code java>
 JFrame ablak JFrame ablak
Sor 71: Sor 75:
 new JFrame(); new JFrame();
 </code> </code>
 +A JFrame() konstruktort hívjuk paraméterek nélkül. 
  
  
Sor 93: Sor 98:
  
  
 +Ha futtatjuk a programot, az ablak bezárása után, ne felejtsük  
 +el a programot is leállítani Ctrl+C billentyűkombinációval a  
 +terminálablakban. 
 ==== Második program ==== ==== Második program ====
  
 A második programunk eredménye mindenben megegyezik az előzővel,  A második programunk eredménye mindenben megegyezik az előzővel, 
 viszont másként valósítottuk meg. Kihasználjuk a Java objektum viszont másként valósítottuk meg. Kihasználjuk a Java objektum
-orientált tulajdonságait, és a megvalósításhoz az öröklést használjuk.+orientált lehetőségeit, és a megvalósításhoz az öröklést használjuk.
  
 <code java Program.java> <code java Program.java>
Sor 107: Sor 114:
  Program()  Program()
  {  {
- setSize(400, 300); + this.setSize(400, 300); 
- setVisible(true);+ this.setVisible(true);
  }  }
   
Sor 123: Sor 130:
  
  
-Ugyanez NetBeans rendszerben: 
-<code java Program.java> 
-/* 
- * To change this template, choose Tools | Templates 
- * and open the template in the editor. 
- */ 
- 
-package program; 
-import javax.swing.JFrame; 
- 
-/** 
- * 
- * @author andras 
- */ 
-public class Program extends JFrame{ 
- 
-    /** 
-     * @param args the command line arguments 
-     */ 
-    Program() 
-    { 
-        setSize(400, 300); 
-        setVisible(true); 
-    } 
-    public static void main(String[] args) { 
-        // TODO code application logic here 
-        new Program(); 
-    } 
-} 
-</code> 
- 
-A megjegyzéseket akár ki is törölhetjük. 
- 
-Vegyük észre, hogy a megjegyzéseket nem tekintve a 
-különbség csak az, hogy NetBeans forrásprogramjában 
-van a forráskód elején egy package program; nevű sor. 
  
 ==== A második program elemzése ==== ==== A második program elemzése ====
Sor 174: Sor 145:
 Program() Program()
 { {
- setSize(400, 300); + this.setSize(400, 300); 
- setVisible(true);+ this.setVisible(true);
 } }
 </code> </code>
Sor 187: Sor 158:
  
 <code java> <code java>
-setSize(400, 300); +this.setSize(400, 300); 
-setVisible(true);+this.setVisible(true);
 </code> </code>
  
Sor 195: Sor 166:
 <code java> <code java>
 new Program(); new Program();
 +</code>
 +
 +==== Ablakbezárás esemény ====
 +
 +A grafikus programok eseményvezéreltek. A program folyamatosan fut, és
 +események bekövetkezését várja. Ilyen események az egérkattintás és a
 +billentyűzetnyomás, egy komponens valamely tulajdonságának megváltozása, 
 +stb. Egy normál alkalmazás ablak címsorában van egy bezárás gomb, általában 
 +valamilyen "X" alakzat, egy minimalizálás és egy maximalizálás gomb. 
 +A bezárás gombra kattintva kiváltódik az úgynevezett "Close" esemény. 
 +Ez az ablak elrejtését jelenti, de nem a program befejezését,
 +bár általában a főablak elrejtésével együtt a program befejezését is
 +szeretnénk. 
 +
 +A következő programban egy alapértelmezett kezelőt adunk az ablakhoz, amely
 +megvalósítja a program befejezését, ha erre az ikonra kattint a felhasználó.
 +
 +Az ablak bezárás eseményt vezérelhetjük a setDefaultCloseOperation() metódussal. 
 +Általában azt szeretnénk, ha a bezárás eseményre az alkalmazás futtatása is
 +fejeződjön be. Ehhez hívjuk a setDefaultCloseOperation() metódust a
 +JFrame.EXIT_ON_CLOSE állandóval:
 +
 +<code java>
 +this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +</code>
 +
 +Az állandó több osztályból is beállítható:
 +  * JFrame
 +  * JInternalPane
 +  * JDialog
 +
 +Minden osztályban négy lehetőség állítható be:
 +
 +
 +  * DO_NOTHING_ON_CLOSE
 +    * Nem csinál semmit ablak bezárásra kattintva. A WindowsListener segítségével más hatásokat is beállíthatsz.
 +  * HIDE_ON_CLOSE (az alapértelmezett beállítás JDialog és JFrame esetén)
 +    * Az ablak elrejtése. 
 +  * DISPOSE_ON_CLOSE (az alapértelmezett JInternalFrame esetén)
 +    * Elrejti és megszünteti az ablakot. 
 +  * EXIT_ON_CLOSE (A JFrame osztályban van definiálva)
 +    * Kilép az alkalmazásból, a System.exit(0) hívással. Alkalmazások esetén csak ez ajánlott. 
 +
 +
 +<code java Program.java>
 +import javax.swing.JFrame;
 +class Program extends JFrame
 +{
 + Program()
 + {
 + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 + this.setSize(400, 300);
 + this.setVisible(true);
 + }
 + public static void main(String args[])
 + {
 + new Program();
 + }
 +}
 </code> </code>
  
Sor 201: Sor 231:
  
 A következő programunk ablakára egy feliratot fogunk elhelyezni, amit a JLabel osztállyal valósítunk meg. A következő programunk ablakára egy feliratot fogunk elhelyezni, amit a JLabel osztállyal valósítunk meg.
 +
 +Alapértelmezett magassága: 15
 +
  
 <code java Program.java> <code java Program.java>
 import javax.swing.JFrame; import javax.swing.JFrame;
 import javax.swing.JLabel; import javax.swing.JLabel;
 +
 class Program extends JFrame class Program extends JFrame
 { {
- JLabel felirat;+ JLabel label1;
  Program()  Program()
  {  {
- felirat = new JLabel("Helló Világ!"); + this.label1 = new JLabel("Helló Világ!"); 
- add(felirat); + this.add(this.label1); 
- setSize(400, 300); + this.setSize(400, 300); 
- setVisible(true);+ this.setVisible(true);
  }   }
  public static void main(String args[])  public static void main(String args[])
Sor 230: Sor 264:
 Az ablakhoz hozzáadtuk a felirat nevű objektumot: Az ablakhoz hozzáadtuk a felirat nevű objektumot:
 <code java> <code java>
-add(felirat);+this.add(this.label1);
 </code> </code>
  
Sor 239: Sor 273:
   import javax.swing.JLabel   import javax.swing.JLabel
  
-felírat bármikor újraírható:+{{:oktatas:programozas:java:jlabel_gui_swing.png|}} 
 + 
 + 
 +felirat bármikor újraírható:
 <code java> <code java>
-label1.setText("Másik felirat");+this.label1.setText("Másik felirat");
 </code> </code>
  
Sor 248: Sor 285:
 Ha a JLabel komponens háttérszínét szeretnénk változtatni, akkor előtte szükséges a setOpaque(): Ha a JLabel komponens háttérszínét szeretnénk változtatni, akkor előtte szükséges a setOpaque():
 <code java> <code java>
-label1.setOpaque(true); +this.label1.setOpaque(true); 
-label1.setBackground(Color.blue); +this.label1.setBackground(Color.blue); 
-label1.setForeground(Color.WHITE);+this.label1.setForeground(Color.WHITE);
 </code> </code>
  
Sor 260: Sor 297:
 ... ...
 //RIGHT, LEFT, CENTER //RIGHT, LEFT, CENTER
-label1.setHorizontalAlignment(SwingConstants.CENTER);+this.label1.setHorizontalAlignment(SwingConstants.CENTER);
 //TOP, BOTTOM, CENTER //TOP, BOTTOM, CENTER
-label1.setVerticalAlignment(SwingConstants.TOP);+this.label1.setVerticalAlignment(SwingConstants.TOP);
 </code> </code>
 +
 +
 +Szegély, font, szín:
 +<code java>
 +this.label1 = new JLabel("Valami");        
 +Border border = new EmptyBorder(10, 10, 10, 10);
 +this.label1.setBorder(border);
 +this.label1.setFont(new Font("Sans serif", Font.BOLD, 22));
 +this.label1.setForeground(Color.blue);
 +</code>
 +
  
 ==== Ablak automatikus méretezése ==== ==== Ablak automatikus méretezése ====
Sor 270: Sor 318:
 import javax.swing.JFrame; import javax.swing.JFrame;
 import javax.swing.JLabel; import javax.swing.JLabel;
 +
 class Program extends JFrame class Program extends JFrame
 { {
- JLabel felirat;+ JLabel label1;
  Program()  Program()
  {  {
- felirat = new JLabel("Helló Világ!"); + this.label1 = new JLabel("Helló Világ!"); 
- add(felirat); + this.add(this.label1); 
- pack(); + this.pack(); 
- setVisible(true);+ this.setVisible(true);
  }   }
  public static void main(String args[])  public static void main(String args[])
Sor 326: Sor 375:
  
  
- 
- 
-===== Ablakbezárás esemény kezelése ===== 
-==== DefaultCloseOperation() ==== 
- 
- 
-A grafikus programok eseményvezéreltek. A program folyamatosan fut, és 
-események bekövetkezését várja. Ilyen események az egérkattintás és a 
-billentyűzetnyomás, egy komponens valamely tulajdonságának megváltozása,  
-stb. Egy normál alkalmazás ablak címsorában van egy bezárás gomb "X", egy 
-minimalizálás és egy maximalizálás gomb. A bezárás gombra kattintva kiváltódik 
-az úgynevezett "Close" esemény.  
- 
-Biztosan észrevettük, hogy ablakunk eddig nem záródott be, amikor  
-az "X"-re kattintottuk. Az "X" alatt értve az ablak címsorában a bezárásikont. 
-A következő programban egy alapértelmezett kezelőt adunk az ablakhoz, amely 
-megvalósítja a program befejezését, ha erre az ikonra kattint a felhasználó. 
- 
- 
-<code java Program.java> 
-import javax.swing.JFrame; 
-import javax.swing.JLabel; 
-class Program extends JFrame 
-{ 
- JLabel felirat; 
- Program() 
- { 
- felirat = new JLabel("Helló Világ!"); 
- add(felirat); 
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
- pack(); 
- setVisible(true); 
- }  
- public static void main(String args[]) 
- { 
- new Program(); 
- } 
-} 
-</code> 
- 
- 
- 
-Az újabb sor amit hozzáadtunk a programunkhoz: 
-<code java> 
-setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
-</code> 
- 
-Az EXIT_ON_CLOSE a JFrame osztály egy mezője, amely valójában egy 
-számállandó. Ha ezt a számállandót adjuk meg a setDefaultClsoeOperation() 
-metódus paramétereként, akkor a program kilép a "Close" esemény bekövetkezésekor. 
- 
- 
-==== Ablakbezárás esemény ==== 
- 
- 
- 
- 
-Alapértelmezetten amikor a felhasználó bezárja az ablakot, az ablak elrejtésre kerül.  
- 
-A setDefaultCloseOperation argumentumaként más értékeket is beállíthatunk.  
- 
-<code java> 
-ablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
-</code> 
- 
- 
-Négy érték állítható be JFrame, JInternalPane és JDialog esetén: 
- 
- 
-  * DO_NOTHING_ON_CLOSE 
-    * Nem csinál semmit ablak bezárásra kattintva. A WindowsListener segítségével más hatásokat is beállíthatsz. 
-  * HIDE_ON_CLOSE (az alapértelmezett beállítás JDialog és JFrame esetén) 
-    * Az ablak elrejtése.  
-  * DISPOSE_ON_CLOSE (az alapértelmezett JInternalFrame esetén) 
-    * Elrejti és megszünteti az ablakot.  
-  * EXIT_ON_CLOSE (A JFrame osztályban van definiálva) 
-    * Kilép az alkalmazásból, a System.exit(0) hívással. Alkalmazások esetén csak ez ajánlott.  
  
  
Sor 674: Sor 646:
 </code> </code>
  
 +{{:oktatas:programozas:java:ket_label_gui_swing.png|}}
  
 A FlowLayout() konstruktorral megmondjuk, hogy a komponenseket egymás után sorba helyezzük el.  A FlowLayout() konstruktorral megmondjuk, hogy a komponenseket egymás után sorba helyezzük el. 
Sor 683: Sor 655:
 </code> </code>
  
-Itt szeretném megjegyezni, hogy ha az awt csomagból csak a FlowLayout osztályt használjuk, akkor + 
-az importálásnál megadhatjuk, hogy csak ezt az osztályt importálom:+ 
 +Importálhatjuk csak a FlowLayout osztályt:
 <code java> <code java>
 import java.awt.FlowLayout; import java.awt.FlowLayout;
Sor 729: Sor 702:
 } }
 </code> </code>
 +
 +{{:oktatas:programozas:java:ket_label_abszolutpoz_gui_swing.png|}}
  
 Vegyük észre, hogy az ablak.setLayout() paramétere most már null: Vegyük észre, hogy az ablak.setLayout() paramétere most már null:
Sor 737: Sor 712:
 A komponenseknél meghatározzuk a setBounds() metódussal a helyüket és méretüket.  A komponenseknél meghatározzuk a setBounds() metódussal a helyüket és méretüket. 
 <code java> <code java>
-cimke1.setBounds(50,50, 100, 100); +felirat1.setBounds(50,50, 100, 100); 
-cimke2.setBounds(50,100, 100, 100);+felirat2.setBounds(50,100, 100, 100);
 </code> </code>
  
  
-===== Gomb (JButton=====+===== JButton =====
  
 Alapértelmezett magasság: 25 pont Alapértelmezett magasság: 25 pont
  
 <code java Program01.java> <code java Program01.java>
-JButton gomb = new JButton("Klikkelj ide"); +JButton button1 = new JButton("Kattints ide");
-gomb.setText("Más felirat"); +
-gomb.addActionListener(new Gomb_Click());+
 </code> </code>
  
 +<code java>
 +JButton button1 = new JButton("Kattints ide");
 +button1.setText("Más felirat");
 +button1.addActionListener(new Button_Click());
 +</code>
  
-A java.awt.Insets osztály használható az JButton, JTextField és a JTextArea esetén is.+ 
 +A java.awt.Insets osztály használható JButton, JTextField és a JTextArea esetén is.
  
 Belső margó: Belső margó:
   nextButton.setMargin(new Insets(10, 10, 10, 10));   nextButton.setMargin(new Insets(10, 10, 10, 10));
 +
 +
 +==== Kép a gombon ====
 +
 +<code java>
 +button1 = new JButton(new ImageIcon("assets/kep02.png")); 
 +</code>
 +
 +
 ===== Eseménykezelés ===== ===== Eseménykezelés =====
 ==== Eseménykezelés Lambda kifejezéssel ==== ==== Eseménykezelés Lambda kifejezéssel ====
Sor 766: Sor 754:
 import javax.swing.JFrame; import javax.swing.JFrame;
 import javax.swing.JButton; import javax.swing.JButton;
-class Program01 extends SFrame +class Program01 extends JFrame 
- JButton closeButton = new JButton("Bezár");+  
 +    JButton closeButton = new JButton("Kilépés"); 
 + 
  public Program01() {  public Program01() {
  this.closeButton.setBounds(100, 100, 100, 30);  this.closeButton.setBounds(100, 100, 100, 30);
  this.closeButton.addActionListener(event -> closeButtonAction());  this.closeButton.addActionListener(event -> closeButtonAction());
- + 
  this.add(closeButton);  this.add(closeButton);
  this.setLayout(null);  this.setLayout(null);
- this.setSize(800, 600); 
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- this.setCenter();+ this.setSize(400, 300);
  this.setVisible(true);   this.setVisible(true);
  }  }
Sor 783: Sor 772:
  }  }
  public static void main(String[] args) {  public static void main(String[] args) {
- Program01 prog = new Program01(); + new Program01();
  }  }
 } }
- 
 </code> </code>
  
Sor 792: Sor 780:
 ==== ActionPerformed ==== ==== ActionPerformed ====
  
-Az események figyeléséhez a Java 8 előtti verziókban az egyik lehetőség a+Az események figyeléséhez a Java 8 előtti verziókban az egyik lehetőség
 az ActionListener interfész használata.  az ActionListener interfész használata. 
  
 Az ActionListener egy actionPerformed() nevű metódust követel meg, Az ActionListener egy actionPerformed() nevű metódust követel meg,
 amiben reagálhatunk a bekövetkezett eseményekre. Az actionPerformed()  amiben reagálhatunk a bekövetkezett eseményekre. Az actionPerformed() 
-metódus rendelkezik egy kötelező metódussal, aminek a típusa+metódus megkövetel egy kötelező paramétert, aminek a típusa
 ActionEvent. Az ActionEvent objektumból lekérdezhető, melyik  ActionEvent. Az ActionEvent objektumból lekérdezhető, melyik 
 komponens váltotta ki az eseményt.  komponens váltotta ki az eseményt. 
Sor 869: Sor 857:
  
 Szövegdobozt a JTextField osztállyal hozhatunk létre.  Szövegdobozt a JTextField osztállyal hozhatunk létre. 
 +
 +  * Alapértelmezett magassága: 19
 +  * Alapértelmezett szélessége: 5
 +
 +
 A szöveg doboznak kezdőértéket adhatunk a konstruktorban a Text tulajdonsággal. Például: A szöveg doboznak kezdőértéket adhatunk a konstruktorban a Text tulajdonsággal. Például:
 <code java> <code java>
Sor 911: Sor 904:
  add(duplazasgomb);  add(duplazasgomb);
  add(szammezo);  add(szammezo);
- setLayout(new FlowLayout()); + setLayout(new FlowLayout()); 
 +        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  pack();   pack(); 
  setVisible(true);  setVisible(true);
Sor 940: Sor 934:
  
  
-Alapértelmezett magasság: 19 pont.+{{:oktatas:programozas:java:textfield_gui_swing.png|}} 
 + 
 + 
 +A JTextField alapértelmezett magassága: 19 pont. 
  
  
Sor 980: Sor 978:
 import java.awt.FlowLayout; import java.awt.FlowLayout;
 import java.awt.Dimension; import java.awt.Dimension;
 + 
 class Program01 extends JFrame class Program01 extends JFrame
 { {
- final static long serialVersionUID = 1; 
  DefaultListModel<String> listModel = new DefaultListModel<String>();  DefaultListModel<String> listModel = new DefaultListModel<String>();
  JList<String> jlist1 = new JList<String>(listModel);  JList<String> jlist1 = new JList<String>(listModel);
  JScrollPane scrollPane1 = new JScrollPane(jlist1);  JScrollPane scrollPane1 = new JScrollPane(jlist1);
- + 
  Program01()  Program01()
  {   {
Sor 995: Sor 992:
  listModel.addElement("Harmadik");  listModel.addElement("Harmadik");
  listModel.addElement("Negyedik");  listModel.addElement("Negyedik");
- + 
  add(scrollPane1);  add(scrollPane1);
  setLayout(new FlowLayout());  setLayout(new FlowLayout());
 +        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  pack();  pack();
  setVisible(true);  setVisible(true);
Sor 1007: Sor 1005:
 } }
 </code> </code>
 +
 +
 +{{:oktatas:programozas:java:jlist_gui_swing.png|}}
  
  
Sor 1284: Sor 1285:
 }); });
 </code> </code>
 +
 +
 +===== ComboBox =====
 +
 +<code java Program.java>
 +import javax.swing.*;
 +
 +class Program extends JFrame
 +{
 + JComboBox combo;
 + Program()
 + {
 + combo = new JComboBox();
 +
 + combo.setSize(100, 30);
 + combo.addItem("Első");
 + combo.addItem("Második");
 + combo.addItem("Harmadik");
 + combo.addItem("Negyedik");
 + combo.addItem("Ötödik");
 +
 + add(combo);
 + setLayout(null);
 + setSize(200, 100);
 + setVisible(true);
 + }
 + public static void main(String args[])
 + {
 + new Program();
 + }
 +}
 +</code>
 +
 +{{:oktatas:programozas:java:javaswing_combobox.png|}}
 +
 +A ComboBox alapértelmezett magassága 24 pont.
 +
 +
 +<code java>
 +combo.removeAllItem();
 +</code>
 +
 +Ha kiválasztott változott:
 +<code java>
 +import java.awt.event.ItemEvent;
 +import java.awt.event.ItemListener;
 +
 +...
 +
 +comboBox.addItemListener(new ItemListener()
 +{
 + public void itemStateChanged(ItemEvent e)
 + {
 +
 + }
 +});
 +</code>
 +
 +
 +Ha kiválasztunk egy elemet, akkor az esemény kétszer váltódik ki. 
 +Az e.getStateChange() először 2, majd 1-et ad vissza. Ez alapján
 +szétválaszthatjuk a két eseményt:
 +<code java>
 +groupComboBox.addItemListener(new ItemListener()
 +{
 + public void itemStateChanged(ItemEvent e)
 + {
 + if(e.getStateChange()==2)
 + ; //Csinálunk valamit
 + }
 +});
 +</code>
 +
 +
 +<code java>
 +int a = lld.getItemCount();
 +int b = lld.getSelectedIndex();
 +</code>
 +
 +Adott elem lekérése:
 +<code java>
 +if(lld.getItemCount()>0)
 +    String str = (String) lld.getSelectedItem();
 +</code>
 +
 +A getSelectedItem() metódus Object típust ad vissza. 
 +
 +===== Model használata =====
 +
 +<code java Program.java>
 +import javax.swing.*;
 + 
 +class Program extends JFrame
 +{
 + DefaultComboBoxModel comboModel;
 + JComboBox combo;
 + Program()
 + {
 + comboModel = new JComboBox();
 + combo = new JComboBox(comboModel);
 + combo.setSize(100, 30);
 +
 + comboModel.addElement("Első");
 + comboModel.addElement("Második");
 + comboModel.addElement("Harmadik");
 + comboModel.addElement("Negyedik");
 + comboModel.addElement("Ötödik");
 + 
 + add(combo);
 + setLayout(null);
 + setSize(200, 100);
 + setVisible(true);
 + }
 + public static void main(String args[])
 + {
 + new Program();
 + }
 +}
 +</code>
 +
 +==== ComboBox feltöltés ====
 +
 +Adott egy lista, benne beosztások:
 +
 +<code java>
 +    Rank[] rankArray = {
 +        new Rank(1, "takarító"),
 +        new Rank(2, "gondnok"),
 +        new Rank(3, "villanyszerelő"),
 +    };
 +    Vector<Rank> rankList = new Vector<>(Arrays.asList(rankArray));
 +</code>
 +
 +Feltöltés:
 +<code java>
 +        rankList.forEach(rank -> {
 +            comboModel.addElement(rank.name);
 +        }); 
 +</code>
 +
 +A feltöltés egy másik módja:
 +<code java>
 +        for(Rank rank : rankList) {
 +            comboModel.addElement(rank.name);
 +        }
 +</code>
 +
 +
 +
 +Teljeskód:
 +
 +<code java Rank.java>
 +public class Rank {
 +    int id;
 +    String name;
 +    public Rank(int id, String name) {
 +        this.id = id;
 +        this.name = name;
 +    }    
 +}
 +</code>
 +
 +
 +<code java MainFrame.java>
 +import java.awt.Dimension;
 +import java.awt.FlowLayout;
 +import java.util.Arrays;
 +import java.util.Vector;
 +
 +import javax.swing.DefaultComboBoxModel;
 +import javax.swing.JComboBox;
 +import javax.swing.JFrame;
 +
 +public class MainFrame extends JFrame {
 +    DefaultComboBoxModel<String> comboModel;
 +    JComboBox<String> combo;
 +    Rank[] rankArray = {
 +        new Rank(1, "takarító"),
 +        new Rank(2, "gondnok"),
 +        new Rank(3, "villanyszerelő"),
 +    };
 +    Vector<Rank> rankList = new Vector<>(Arrays.asList(rankArray));
 +
 +    public MainFrame() {
 +        setComponent();
 +        setMainFrame();
 +    }
 +    private void setComponent() {
 +        comboModel = new DefaultComboBoxModel<>();
 +        combo = new JComboBox<>(comboModel);
 +        combo.setPreferredSize(new Dimension(100, 32));
 +        rankList.forEach(rank -> {
 +            comboModel.addElement(rank.name);
 +        });    
 +    }
 +    private void setMainFrame() {
 +
 +        this.add(combo);
 +        this.setLayout(new FlowLayout());
 +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +        this.setSize(400, 300);
 +        this.setVisible(true);
 +
 +    }
 +    
 +}
 +
 +</code>
 +
 +
 +<code java App.java>
 +public class App {
 +    public static void main(String[] args) throws Exception {
 +        new MainFrame();
 +    }
 +}
 +</code>
 +
 +==== Állapot változás eseménye ====
 +
 +<code java>
 +combo.addItemListener(e -> changedStateRankCombo(e));
 +</code>
 +
 +A program indulásakor bekövetkezik az új elem kiválasztása.
 +Ezt követően mindig két esemény következik be. 
 +  * előző elem nincs kiválasztva
 +  * új elem kiválasztva
 +
 +<code java>
 +    private void changedStateRankCombo(ItemEvent event) {
 +        if (event.getStateChange() == ItemEvent.DESELECTED)
 +            System.out.println("előző nincs kiválasztva");
 +        if (event.getStateChange() == ItemEvent.SELECTED)
 +            System.out.println("új kiválasztva");        
 +    }
 +</code>
 +
 +Kiválasztott:
 +<code java>
 +    private void changedStateRankCombo(ItemEvent event) {
 +        if (event.getStateChange() == ItemEvent.SELECTED) {
 +            Object item = event.getItem();
 +            System.out.println(item);
 +        }
 +    }
 +</code>
 +
 +==== Akcióesemény ====
 +Használhatjuk az ActionListener-t is, de egyszerre csak egyet használjunk. 
 +
 +<code java>
 +combo.addActionListener(event -> actionRankCombo(event));
 +</code>
 +
 +<code java>
 +    private void actionRankCombo(ActionEvent event) {
 +        System.out.println("új kiválasztva");        
 +    }
 +</code>
 +
  
  
Sor 1299: Sor 1561:
 javax.swing.JOptionPane.showMessageDialog(getContentPane(), ""); javax.swing.JOptionPane.showMessageDialog(getContentPane(), "");
 </code> </code>
 +
 +
 +{{:oktatas:programozas:java:joptionpane_gui_swing.png|}}
 ==== Üzenetablakok ==== ==== Üzenetablakok ====
  
Sor 1382: Sor 1647:
 Saját párbeszédablak készítése, átadott értékkel. Saját párbeszédablak készítése, átadott értékkel.
  
-<code java Program02.java>+<code java Program.java>
 import javax.swing.JFrame; import javax.swing.JFrame;
 import javax.swing.JDialog; import javax.swing.JDialog;
Sor 1392: Sor 1657:
 import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
  
-class Program02 extends JFrame+class Program extends JFrame
 { {
  JButton gomb = new JButton("Bekér");  JButton gomb = new JButton("Bekér");
  JTextField mezo = new JTextField(10);  JTextField mezo = new JTextField(10);
- Program02()+ Program()
  {  {
  gomb.addActionListener(new ActionListener()  gomb.addActionListener(new ActionListener()
Sor 1414: Sor 1679:
  public static void main(String args[])  public static void main(String args[])
  {  {
- new Program02();+ new Program();
  }  }
 } }
Sor 1449: Sor 1714:
 </code> </code>
  
-===== Ikon =====+Főablak:
  
 +{{:oktatas:programozas:java:parbeszedablak_main_gui_swing.png|}}
  
-<code java> +Párbeszédablak:
-import javax.swing.*;+
  
-class ap +{{:oktatas:programozas:java:parbeszedablak_dialog_gui_swing.png|}}
-{ +
-    public static void main(String args[]) +
-    { +
- JFrame ablak = new JFrame("Vmi"); +
- ablak.setLayout(null); +
-  +
- ablak.setIconImage(new ImageIcon("ikon.png").getImage());+
  
- ablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); +===== JDilaog szülőablakon belül középre igazítva ===== 
- ablak.setSize(400,300); + 
- ablak.setVisible(true);+<code App.java> 
 +import javax.swing.JButton; 
 +import javax.swing.JDialog; 
 +import javax.swing.JFrame; 
 +import java.awt.Dimension; 
 + 
 +class OperationFrame extends JDialog { 
 +    JButton button; 
 +    public OperationFrame(JFrame parent) { 
 +        super(parent); 
 +        this.button = new JButton("Bezár"); 
 + 
 +        this.add(this.button); 
 +        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
 +        this.setSize(300, 200);   
 + 
 +        // Középre igazítjuk a dialógusablakot a szülőablak közepén 
 +        Dimension dim = parent.getSize(); 
 +        int w = this.getSize().width; 
 +        int h = this.getSize().height; 
 +        int x = parent.getLocation().x + (dim.width - w) / 2; 
 +        int y = parent.getLocation().y + (dim.height - h) / 2; 
 +        this.setLocation(x, y); 
 +    }     
 +
 + 
 +class MainFrame extends JFrame { 
 +    JButton button; 
 +    public MainFrame() { 
 +        this.button = new JButton("Mehet"); 
 +        this.button.addActionListener(e -> { 
 +            this.startDialog();     
 +        }); 
 + 
 +        this.add(this.button); 
 +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 +        this.setSize(400, 300); 
 +        this.setVisible(true); 
 +    } 
 +    private void startDialog() { 
 +        OperationFrame operationFrame = new OperationFrame(this); 
 +        operationFrame.setVisible(true); 
 +    } 
 +
 + 
 +class App { 
 +    public static void main(String[] args) { 
 +        new MainFrame();
     }     }
 } }
Sor 1472: Sor 1777:
  
  
-Készíthetünk külön ikon változót, amit esetleg másra is használhatunk.  
-<code java> 
-    ImageIcon ikon = new ImageIcon("ikon.png"); 
-    ablak.setIconImage(ikon.getImage()); 
-</code> 
  
 +===== Ikon =====
  
-Esetleg így: +<code java>
-<code java Program.java>+
 import javax.swing.*; import javax.swing.*;
-import java.awt.*;+
 class Program extends JFrame class Program extends JFrame
 { {
  Program()  Program()
  {   {
- setIconImage(new ImageIcon("kep.png").getImage());+ setIconImage(new ImageIcon("ikon.png").getImage());
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setSize(300, 200);  setSize(300, 200);
Sor 1498: Sor 1798:
 } }
 </code> </code>
 +
 +
 +{{:oktatas:programozas:java:ikon_gui_swing.png|}}
 +
 +
 +Készíthetünk külön ikon változót, amit esetleg másra is használhatunk. 
 +<code java>
 +    ImageIcon ikon = new ImageIcon("ikon.png");
 +    ablak.setIconImage(ikon.getImage());
 +</code>
 +
  
  
 A megvalósításhoz egy rögtönzött ikon: A megvalósításhoz egy rögtönzött ikon:
-  * http://szit.hu/download/oktatas/java/kep.png+  * https://szit.hu/download/oktatas/java/ikon.png
  
 +==== Ikon a gombhoz ====
  
-<code java Program01.java>+<code java Program.java>
 import javax.swing.JFrame; import javax.swing.JFrame;
 import javax.swing.JButton; import javax.swing.JButton;
 import javax.swing.ImageIcon; import javax.swing.ImageIcon;
-//~ import java.awt.Image; + 
-class Program01 extends JFrame+class Program extends JFrame
 { {
  JButton gomb = new JButton("Klikkelj ide");  JButton gomb = new JButton("Klikkelj ide");
- Program01()+ Program()
  {  {
  setIconImage(new ImageIcon("ikon.png").getImage());  setIconImage(new ImageIcon("ikon.png").getImage());
- //~ Image kep = new ImageIcon("ikon.png").getImage().getScaledInstance( 
-                //~ 24, 24,  java.awt.Image.SCALE_SMOOTH); 
  gomb.setIcon(new ImageIcon("ikon.png"));  gomb.setIcon(new ImageIcon("ikon.png"));
   
Sor 1526: Sor 1836:
  public static void main(String[] args)  public static void main(String[] args)
  {  {
- new Program01();+ new Program();
  }  }
 } }
 </code> </code>
 +
 +Méretezés:
 +<code java>
 +Image kep = new ImageIcon("ikon.png").getImage()
 +.getScaledInstance(24, 24,  java.awt.Image.SCALE_SMOOTH);
 +</code>
 +
 +
  
 A program ikon csak kis méretben jelenik meg. A nyomógombhoz rendelt ikon viszont az eredeti  A program ikon csak kis méretben jelenik meg. A nyomógombhoz rendelt ikon viszont az eredeti 
Sor 1539: Sor 1857:
 <code java> <code java>
 java.net.URL imageURL =  java.net.URL imageURL = 
- Program01.class.getResource("images/Program01Icon_32x32.png");+ Program.class.getResource("images/ProgramIcon_32x32.png");
  setIconImage(new ImageIcon(imageURL).getImage());  setIconImage(new ImageIcon(imageURL).getImage());
 </code> </code>
Sor 1546: Sor 1864:
 <code java> <code java>
 java.net.URL imageURL =  java.net.URL imageURL = 
- getClass().getResource("images/Program01Icon_32x32.png");+ getClass().getResource("images/ProgramIcon_32x32.png");
 </code> </code>
  
Sor 1571: Sor 1889:
  
 Minden JComponentnek lehet egy vagy több szegélye.  Minden JComponentnek lehet egy vagy több szegélye. 
-A border, azaz a szegély megmondja, hogy nézzen ki egy+A border, azaz a szegélymegmondja, hogy nézzen ki egy
 Swing komponens széle, és körbefogja azt. Swing komponens széle, és körbefogja azt.
  
 A JComponent-ek számára szegélyt a setBorder() metódussal  A JComponent-ek számára szegélyt a setBorder() metódussal 
-határozhatunk meg. A BorderFactory osztályt használhatjuk +határozhatunk meg.  
-szegély jellegének megadásánál.+ 
 +Többféle szegély használható:  
 +  * EmptyBorder 
 +  * LinesBorder 
 +  * stb. 
 + 
 +Ezek létrehozhatók az adott osztállyal vagy a BorderFactory kreátorral. 
 + 
 +A következőkben néhány példát látunk:
  
-A következőben egy szimpla panel egyszerű szegélyét adjuk meg. 
 <code java> <code java>
-JPanel pane = new JPanel(); +this.panel1.setBorder(BorderFactory.createLineBorder(Color.BLUE)); 
-pane.setBorder(BorderFactory.createLineBorder(Color.black));+this.panel2.setBorder(BorderFactory.createRaisedBevelBorder()); 
 +this.panel3.setBorder(BorderFactory.createLoweredBevelBorder()); 
 +this.panel4.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED)); 
 +this.panel5.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED)); 
 +this.panel6.setBorder(BorderFactory.createEmptyBorder());
 </code> </code>
 +
 +{{:oktatas:programozas:java:border01.png|}}
 ==== Egyszerű szegély ==== ==== Egyszerű szegély ====
 Egy konkrét megvalósítás Egy konkrét megvalósítás
-<code java Program01.java>+<code java Program.java>
 import javax.swing.*; import javax.swing.*;
 import java.awt.*; import java.awt.*;
 import javax.swing.border.*; import javax.swing.border.*;
  
-class Program01 {+class Program {
         public static void main(String args[]) {         public static void main(String args[]) {
  JFrame ablak = new JFrame("Szegély példa");  JFrame ablak = new JFrame("Szegély példa");
Sor 1608: Sor 1939:
 } }
 </code> </code>
- + 
 +{{:oktatas:programozas:java:javaswing_border.png|}}
 ==== Szegély cím beállítása ==== ==== Szegély cím beállítása ====
  
Sor 1617: Sor 1949:
 import javax.swing.border.*; import javax.swing.border.*;
  
-class ap+class Program
 { {
         public static void main(String args[])         public static void main(String args[])
Sor 1642: Sor 1974:
 } }
 </code> </code>
 +
 +{{:oktatas:programozas:java:javaswing_titledborder.png|}}
  
  
Sor 1689: Sor 2023:
 panel1.setBorder(new EmptyBorder(10, 10, 10, 10) ); panel1.setBorder(new EmptyBorder(10, 10, 10, 10) );
 </code> </code>
 +===== Szegélyek =====
 +==== LineBorder ====
 +
 +<code java MainWindow.java>
 +import java.awt.Color;
 +
 +import javax.swing.JFrame;
 +import javax.swing.JPanel;
 +import javax.swing.border.LineBorder;
 +
 +public class MainWindow extends JFrame {
 +    JPanel panel1;
 +
 +    public MainWindow() {
 +        this.panel1 = new JPanel();
 +        this.panel1.setBounds(5, 5, 200, 100);
 +        this.panel1.setBorder(new LineBorder(Color.BLUE));
 +
 +        this.setLayout(null);
 +        this.add(this.panel1);
 +        this.setTitle("App");
 +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +        this.setSize(215, 135);
 +        this.setVisible(true);
 +    }
 +    
 +}
 +
 +</code>
 +
 +
 +
 ==== BevelBorder ==== ==== BevelBorder ====
  
Sor 1776: Sor 2142:
   * http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/ButtonGroup.html   * http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/ButtonGroup.html
  
 +
 +{{:oktatas:programozas:java:javaswing_radiobuttons.png|}}
 +==== Egyszerű rádiógomb ====
 +
 +<code java Program.java>
 +import javax.swing.*;
 +import java.awt.*;
 +
 +class Program extends JFrame
 +{
 + ButtonGroup group;
 + JRadioButton radio1;
 + JRadioButton radio2;
 + JPanel panel;
 + Program()
 + {
 + group = new ButtonGroup();
 + radio1 = new JRadioButton("Első");
 + radio2 = new JRadioButton("Második");
 + panel = new JPanel();
 +
 + group.add(radio1);
 + group.add(radio2);
 + panel.add(radio1);
 + panel.add(radio2);
 + add(panel);
 +
 + panel.setBorder(BorderFactory.createTitledBorder("Valami"));
 + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 + setSize(300, 200);
 + setVisible(true);
 + }
 + public static void main(String args[])
 + {
 + new Program();
 + }
 +}
 +</code>
 +
 +A rádiógombokat, hozzá kell adni a ButtonGroup objektumhoz is, de ez csak csoportosításra szolgál!
 +A megjelenés érdekében a JPanel objektumhoz is hozzá kell adni.
 +Persze a csoportosításnak csak akkor van értelme, ha több csoportunk is van. 
 +
 +{{:oktatas:programozas:java:javaswing_simpleradiobutton.png|}}
 +
 +
 +
 +==== Csoportok ====
 +
 +
 +
 +<code java Program.java>
 +import javax.swing.*;
 +import java.awt.*;
 +
 +class Program extends JFrame
 +{
 + ButtonGroup group1;
 + ButtonGroup group2;
 +
 + JRadioButton[] radio1;
 + JRadioButton[] radio2;
 +
 + JPanel panel1;
 + JPanel panel2;
 + Program()
 + {
 + group1 = new ButtonGroup();
 + group2 = new ButtonGroup();
 +
 + String[] s1 = {"Első", "Második", "Harmadik", "Negyedik", "Ötödik", "Hatodik"};
 + String[] s2 = {"1", "2", "3", "4", "5", "6"};
 + radio1 = new JRadioButton[6];
 + radio2 = new JRadioButton[6];
 + panel1 = new JPanel();
 + panel2 = new JPanel();
 +
 + for(int i=0; i<6;i++)
 + {
 + radio1[i] = new JRadioButton(s1[i]);
 + group1.add(radio1[i]);
 + panel1.add(radio1[i]);
 + radio2[i] = new JRadioButton(s2[i]);
 + group2.add(radio2[i]);
 + panel2.add(radio2[i]);
 + }
 +
 + panel1.setLayout(new GridLayout(3, 2));
 + panel2.setLayout(new GridLayout(3, 2));
 +
 + add(panel1);
 + add(panel2);
 +
 + panel1.setBorder(BorderFactory.createTitledBorder("Színek"));
 + panel2.setBorder(BorderFactory.createTitledBorder("Vastagság"));
 +
 + setLayout(new FlowLayout());
 + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 + setSize(300, 200);
 + setVisible(true);
 + }
 + public static void main(String args[])
 + {
 + new Program();
 + }
 +}
 +</code>
 +Az utóbbi példában már tömbként hozzuk létre a rádiógombokat. 
 +
 +{{:oktatas:programozas:java:javaswing_group.png|}}
 +
 +==== Rádiógomb panel osztállyal ====
 +
 +Hosszútávon jobban járunk, ha a panelt külön osztályba rakjuk:
 +
 +<code java Program.java>
 +import javax.swing.*;
 +import java.awt.*;
 +
 +class SajatPanel extends JPanel
 +{
 + ButtonGroup group;
 + JRadioButton[] radio;
 +
 + SajatPanel(String[] felirat)
 + {
 + group = new ButtonGroup();
 +
 + radio = new JRadioButton[6];
 + for(int i=0; i<6;i++)
 + {
 + radio[i] = new JRadioButton(felirat[i]);
 + group.add(radio[i]);
 + add(radio[i]);
 + }
 + }
 +}
 +
 +class Program extends JFrame
 +{
 +
 + SajatPanel panel1;
 + SajatPanel panel2;
 + Program()
 + {
 + String[] s1 = {"Első", "Második", "Harmadik", "Negyedik", "Ötödik", "Hatodik"};
 + String[] s2 = {"1", "2", "3", "4", "5", "6"};
 +
 + panel1 = new SajatPanel(s1);
 + panel2 = new SajatPanel(s2);
 +
 + panel1.setLayout(new GridLayout(3, 2));
 + panel2.setLayout(new GridLayout(3, 2));
 +
 + add(panel1);
 + add(panel2);
 +
 + panel1.setBorder(BorderFactory.createTitledBorder("Színek"));
 + panel2.setBorder(BorderFactory.createTitledBorder("Vastagság"));
 +
 + setLayout(new FlowLayout());
 + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 + setSize(300, 200);
 + setVisible(true);
 + }
 + public static void main(String args[])
 + {
 + new Program();
 + }
 +}
 +</code>
 +
 +{{:oktatas:programozas:java:javaswing_radiobutton.png|}}
 +
 +===== Jelölőnégyzetek =====
 +
 +<code java>
 +import javax.swing.JCheckBox;
 +//...
 +JCheckBox check1 = new JCheckBox();
 +</code>
 +
 +
 +Teljes kód:
 +<code java App.java>
 +import javax.swing.JCheckBox;
 +import javax.swing.JFrame;
 + 
 +class MainWindow extends JFrame {
 + 
 +    JCheckBox check1 = new JCheckBox();
 +    public MainWindow() {
 +        this.check1.setText("alma");
 + 
 +        this.add(check1);
 +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +        this.setSize(300, 200);
 +        this.setVisible(true);
 +    }
 + public static void main(String[] args){
 + new MainWindow();
 + }
 +}
 +</code>
 +
 +
 +{{:oktatas:programozas:java:jcheckbox_gui_swing.png|}}
 +==== Lekérdezés ====
 +
 +<code java>
 +this.check1.isSelected()
 +</code>
 +
 +
 +<code java App.java>
 +import java.awt.FlowLayout;
 +import java.awt.event.ActionEvent;
 +
 +import javax.swing.JButton;
 +import javax.swing.JCheckBox;
 +import javax.swing.JFrame;
 +
 +public class MainWindow extends JFrame {
 +
 +    JCheckBox check1 = new JCheckBox();
 +    JButton button1 = new JButton("Mehet");
 +    public MainWindow() {
 +        this.check1.setText("alma");
 +        this.button1.addActionListener((e)->{
 +            button1_on_click(e);
 +        });
 +
 +        this.add(check1);
 +        this.add(button1);
 +        this.setLayout(new FlowLayout());
 +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +        this.setSize(300, 200);
 +        this.setVisible(true);
 +    }
 +    private void button1_on_click(ActionEvent e) {
 +        
 +        if(this.check1.isSelected()) {
 +            System.out.println("kiválasztva");
 +        }
 +        
 +    }
 +}
 +
 +</code>
 +
 +{{:oktatas:programozas:java:jcheckbox_ellenorzes_gui_swing.png|}}
 +==== Beállítás ====
 +
 +<code java>
 +check1.setSelected(true);
 +</code>
 +
 +==== Változás ====
 +
 +<code java>
 +        this.check1.addItemListener((e)->{
 +            System.out.println("változott");
 +        });
 +</code>
 +
 +
 +Teljes kód:
 +
 +<code java App.java>
 +import java.awt.FlowLayout;
 +import java.awt.event.ItemEvent;
 +import javax.swing.JCheckBox;
 +import javax.swing.JFrame;
 +
 +public class MainWindow extends JFrame {
 +
 +    JCheckBox check1 = new JCheckBox();
 +    
 +    public MainWindow() {
 +        this.check1.setText("alma");
 +        this.check1.addItemListener((e)->{
 +            check1_on_itemchanged(e);
 +        });
 +
 +        this.add(check1);
 +        this.setLayout(new FlowLayout());
 +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +        this.setSize(300, 200);
 +        this.setVisible(true);
 +    }
 +
 +    private void check1_on_itemchanged(ItemEvent e) {
 +        System.out.println("változott");
 +    }
 +}
 +
 +</code>
  
 ===== Táblázat ===== ===== Táblázat =====
Sor 1781: Sor 2444:
 ==== Bevezetés a táblázatkészítésbe ==== ==== Bevezetés a táblázatkészítésbe ====
  
-Egy táblázat adatainak megjelenítéséhez a JTable osztály használhatjuk.  +Egy táblázat adatainak megjelenítéséhez a **JTable** osztály használhatjuk.  
-A táblázatot egy JScrollPane nevű konténerosztályra szoktuk feltenni.+A táblázatot egy **JScrollPane** nevű konténerosztályra szoktuk feltenni.
 Ha szeretnénk a sorok és oszlopok számát futási időben változtatnunk, akkor Ha szeretnénk a sorok és oszlopok számát futási időben változtatnunk, akkor
-szükségünk lesz még a DefaultTableModel osztályra. +szükségünk lesz még a **DefaultTableModel** osztályra. 
 Itt fontos megjegyezni, hogy egy táblázat fejléce csak JScrollPane-ra helyezve jelenik meg. Itt fontos megjegyezni, hogy egy táblázat fejléce csak JScrollPane-ra helyezve jelenik meg.
  
 ==== Egyszerű tábla ==== ==== Egyszerű tábla ====
 +
 +Az első megoldásban nem használunk DefaultTableModel és JScrollPane osztályt, csak szimpla tömböket adunk
 +át a JTable konstruktorának. 
  
 <code java Program.java> <code java Program.java>
Sor 1798: Sor 2464:
  Program()  Program()
  {  {
 +                // A táblázat fejrésze:
  String[] mezoNevek = {"id", "Név", "Település", "Kor"};  String[] mezoNevek = {"id", "Név", "Település", "Kor"};
 +                // A táblázat tartalmi része:
  Object[][] adat = {  Object[][] adat = {
  {1, "Nagy Peter", "Szolnok", 67},  {1, "Nagy Peter", "Szolnok", 67},
Sor 1822: Sor 2490:
 </code> </code>
  
 +A fejrész nem jelenik meg, mivel a JScrollPane sem használtuk.
 +
 +{{:oktatas:programozas:java:javaswing_simpletable.png|}}
  
 ==== Tábla fejléccel ==== ==== Tábla fejléccel ====
Sor 1858: Sor 2529:
 } }
 </code> </code>
 +Fordítsuk és futtassuk a programot, látható, hogy a táblázat fejrésze is megjelenik. 
  
-<code java Program01.java>+ 
 + 
 +{{:oktatas:programozas:java:javaswing_headtable.png|}} 
 + 
 + 
 +A következő példában mindhárom osztályt használjuk. Az adattartalom már külön, egy  
 +model nevű objektumban lesz. A táblához a **setModel()** metódussal adjuk.  
 +<code java Program.java>
 import javax.swing.JFrame; import javax.swing.JFrame;
 import javax.swing.JTable; import javax.swing.JTable;
 import javax.swing.JScrollPane; import javax.swing.JScrollPane;
 import javax.swing.table.DefaultTableModel; import javax.swing.table.DefaultTableModel;
- +  
-class Program01 extends JFrame {+class Program extends JFrame {
  DefaultTableModel model = new DefaultTableModel();  DefaultTableModel model = new DefaultTableModel();
  JTable table = new JTable();  JTable table = new JTable();
  JScrollPane spanel = new JScrollPane(table);  JScrollPane spanel = new JScrollPane(table);
-  +  
- public Program01() { + public Program() {  
-  + 
- +
  Object[] felirat = {"Név", "Település"};  Object[] felirat = {"Név", "Település"};
  model.setColumnIdentifiers(felirat);  model.setColumnIdentifiers(felirat);
- + 
  model.addRow(new Object[] {"Nagy János", "Szolnok"});  model.addRow(new Object[] {"Nagy János", "Szolnok"});
- + 
  table.setModel(model);  table.setModel(model);
-  +  
- spanel.setBounds(100100, 300, 200); + spanel.setBounds(2020, 300, 200); 
- + 
  this.add(spanel);  this.add(spanel);
  this.setLayout(null);  this.setLayout(null);
- this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
- this.setSize(800600);+ this.setSize(400300);
  this.setVisible(true);  this.setVisible(true);
  }  }
  public static void main(String[] args) {  public static void main(String[] args) {
- Program01 prg01 = new Program01();+ Program prg01 = new Program();
  }  }
 } }
- 
 </code> </code>
 +
 +{{:oktatas:programozas:java:javaswing_modeltable.png|}}
  
 ==== Oszlop, sor méretezés ==== ==== Oszlop, sor méretezés ====
Sor 1911: Sor 2590:
 </code> </code>
 A példában a második sor magasságát állítjuk be. A példában a második sor magasságát állítjuk be.
-==== Szelekció ====+==== Szelektálás ====
  
 Háttérszín: Háttérszín:
Sor 2061: Sor 2740:
 ==== Cella színezése ==== ==== Cella színezése ====
  
-<code java Program01.java>+<code java Program.java>
 import javax.swing.JFrame; import javax.swing.JFrame;
 import javax.swing.JTable; import javax.swing.JTable;
Sor 2068: Sor 2747:
 import java.awt.Color; import java.awt.Color;
 import javax.swing.table.TableCellRenderer; import javax.swing.table.TableCellRenderer;
- +  
-class Program01 extends JFrame+class Program extends JFrame
 { {
  private JTable tabla;  private JTable tabla;
- +  
- public Program01()+ public Program()
  {  {
  setLayout(null);  setLayout(null);
 + 
  tabla = new JTable(9, 9);  tabla = new JTable(9, 9);
- tabla.setBounds(100100, 300, 200);+ tabla.setBounds(2020, 300, 200);
  int columnWidht = 20;  int columnWidht = 20;
  int rowHeight = 25;  int rowHeight = 25;
 + 
  for(int i=0; i<9; i++)  for(int i=0; i<9; i++)
  tabla.getColumnModel().getColumn(i).setPreferredWidth(columnWidht);  tabla.getColumnModel().getColumn(i).setPreferredWidth(columnWidht);
  for(int i=0; i<9; i++)  for(int i=0; i<9; i++)
  tabla.setRowHeight(i, rowHeight);  tabla.setRowHeight(i, rowHeight);
 + 
  tabla.setDefaultRenderer(Object.class, new MyTableCellRenderer());  tabla.setDefaultRenderer(Object.class, new MyTableCellRenderer());
  tabla.getModel().setValueAt(Color.red, 3, 3);  tabla.getModel().setValueAt(Color.red, 3, 3);
  tabla.getModel().setValueAt(Color.red, 3, 5);  tabla.getModel().setValueAt(Color.red, 3, 5);
  add(tabla);  add(tabla);
 + 
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- setSize(800600);+ setSize(400300);
  setVisible(true);  setVisible(true);
  }  }
  public static void main(String args[])  public static void main(String args[])
  {  {
- new Program01();+ new Program();
  }   }
  class MyTableCellRenderer extends JLabel implements TableCellRenderer  class MyTableCellRenderer extends JLabel implements TableCellRenderer
Sor 2115: Sor 2794:
 } }
 </code> </code>
 +
 +{{:oktatas:programozas:java:javaswing_cellcolor.png|}}
  
 Néhány metódus: Néhány metódus:
Sor 2242: Sor 2923:
  
 </code> </code>
 +
 +==== ArrayList DefaultTableModelbe ====
 +
 +<code java>
 +    public void feltolt() {
 +        //Valahonnan megjönnek a dolgozók
 +        ArrayList<Employee> employeeList = mainModel.getEmployeeList();
 +        
 +        for(Employee emp : employeeList) {
 +            Vector<Object> row = new Vector<>();
 +            row.add(emp.id);
 +            row.add(emp.name);
 +            row.add(emp.city);
 +            row.add(emp.salary);
 +            this.mainwindow.model.addRow(row);
 +        }
 +    }
 +</code>
 +
 +
 +
 +Az ArrayList átalakítható másként is:
 +<code java>
 +for (Employee emp : employeeList) {
 +    Object[] obj = {emp.id, emp.name, emp.city, emp.salary};
 +    model.addRow(obj);
 +}
 +</code>
 +
 +
 +==== Komplett program ====
 +
 +<code java App.java>
 +public class App {
 +    public static void main(String[] args) {
 +        new MainFrame();
 +    }
 +}
 +</code>
 +
 +<code java Employee.java>
 +public class Employee {
 +    Integer id;
 +    String name;
 +    String city;
 +    Double salary;
 +    public Employee(Integer id, String name, String city, Double salary) {
 +        this.id = id;
 +        this.name = name;
 +        this.city = city;
 +        this.salary = salary;
 +    }    
 +}
 +</code>
 +
 +<code java MainFrame.java>
 +import java.awt.BorderLayout;
 +import java.util.ArrayList;
 +import java.util.Vector;
 +
 +import javax.swing.JFrame;
 +import javax.swing.JScrollPane;
 +import javax.swing.JTable;
 +import javax.swing.table.DefaultTableModel;
 +
 +public class MainFrame extends JFrame{
 +    DefaultTableModel model = new DefaultTableModel();
 +    JTable table = new JTable();
 +    JScrollPane pane = new JScrollPane();
 +    public MainFrame() {
 +        ArrayList<Employee> employeeList = new ArrayList<>();        
 +        employeeList.add(new Employee(1, "Erős István", "Szeged", 395.0));
 +        employeeList.add(new Employee(2, "Csontos Ferenc", "Szolnok", 392.3));
 +
 +        Object[] cols = {"#", "Név", "Település", "Fizetés"};        
 +        this.model.setColumnIdentifiers(cols);
 +        for (Employee emp : employeeList) {
 +            Vector<Object> row = new Vector<>();
 +            row.add(emp.id);
 +            row.add(emp.name);
 +            row.add(emp.city);
 +            row.add(emp.salary);
 +            model.addRow(row);
 +        }
 +
 +        this.table.setModel(model);
 +        this.pane.setViewportView(table);
 +
 +        this.table.getColumnModel().getColumn(0).setPreferredWidth(5);
 +        
 +        this.setLayout(new BorderLayout());
 +        this.add(pane, BorderLayout.CENTER);
 +
 +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +        this.setSize(400, 300);
 +        this.setVisible(true);
 +    }
 +}
 +</code>
 +
 +
  
 ==== Irodalom a táblázathoz ==== ==== Irodalom a táblázathoz ====
Sor 2249: Sor 3031:
 Linkek: Linkek:
  
-  * http://www.java2s.com/Tutorial/Java/0240__Swing/CreatingaJTable.htm +  * http://www.java2s.com/Tutorial/Java/0240__Swing/CreatingaJTable.htm (2022) 
-  * http://www.exampledepot.com/egs/javax.swing.table/pkg.html +  * http://www.java2s.com/Code/Java/Swing-Components/SortableTableExample.htm (2022)
-  * http://www.java2s.com/Code/Java/Swing-Components/SortableTableExample.htm +
-  * http://www.javaworld.com/javaworld/javatips/jw-javatip77.html +
-  * http://quicktable.org/jtable/quicktablefinal.htm#9+
   * http://docs.oracle.com/javase/tutorial/uiswing/components/table.html   * http://docs.oracle.com/javase/tutorial/uiswing/components/table.html
   * http://docs.oracle.com/javase/6/docs/api/javax/swing/JTable.html   * http://docs.oracle.com/javase/6/docs/api/javax/swing/JTable.html
Sor 2309: Sor 3088:
  
  
-<code java>+<code java Program.java>
 import javax.swing.*; import javax.swing.*;
 import java.awt.BorderLayout; import java.awt.BorderLayout;
- +  
-class fulespanel extends JFrame+class Program extends JFrame
 { {
 + 
         private JTabbedPane fulespanelek;         private JTabbedPane fulespanelek;
  private JPanel panel1;  private JPanel panel1;
  private JPanel panel2;  private JPanel panel2;
  private JPanel panel3;  private JPanel panel3;
- +  
- fulespanel()+ Program()
  {  {
  setTitle("Fülespanelek");  setTitle("Fülespanelek");
- setSize(800,600); + setSize(400,300); 
- + 
  setLayout( new BorderLayout() );  setLayout( new BorderLayout() );
- + 
  panel1Keszites();  panel1Keszites();
  panel2Keszites();  panel2Keszites();
  panel3Keszites();  panel3Keszites();
- + 
  fulespanelek = new JTabbedPane();  fulespanelek = new JTabbedPane();
  fulespanelek.addTab("Első", panel1);  fulespanelek.addTab("Első", panel1);
  fulespanelek.addTab("Második", panel2);  fulespanelek.addTab("Második", panel2);
  fulespanelek.addTab("Harmadik", panel3);  fulespanelek.addTab("Harmadik", panel3);
- + 
  add(fulespanelek);  add(fulespanelek);
  }   }
Sor 2365: Sor 3144:
         public static void main(String args[])         public static void main(String args[])
         {         {
-                fulespanel ablak = new fulespanel();+                Program ablak = new Program();
                 ablak.setVisible(true);                 ablak.setVisible(true);
         }         }
 } }
 </code> </code>
 +
 +{{:oktatas:programozas:java:javaswing_tabbedpane.png|}}
 +
  
 <code> <code>
Sor 2384: Sor 3166:
 ==== Java füles panel külső linkek ==== ==== Java füles panel külső linkek ====
  
-  * http://www.cs.cf.ac.uk/Dave/HCI/HCI_Handout_CALLER/node61.html +  * http://ngweb.atw.hu/applets/tabbedpaneapplet.html (2022) 
-  * http://ngweb.atw.hu/applets/tabbedpaneapplet.html +  * http://www.codeproject.com/KB/tabs/JTabbedPane.aspx (2022)
-  * http://www.codeproject.com/KB/tabs/JTabbedPane.aspx+
  
  
Sor 2570: Sor 3351:
 </code> </code>
  
 +{{:oktatas:programozas:java:javaswing_menuradiocheck.png|}}
  
-===== ComboBox ===== 
  
- 
-<code java Program.java> 
-import javax.swing.*; 
- 
-class Program extends JFrame 
-{ 
- JComboBox combo; 
- Program() 
- { 
- combo = new JComboBox(); 
-  
- combo.setSize(100, 30); 
- combo.addItem("Első"); 
- combo.addItem("Második"); 
- combo.addItem("Harmadik"); 
- combo.addItem("Negyedik"); 
- combo.addItem("Ötödik"); 
-  
- add(combo); 
- setLayout(null); 
- setSize(200, 100); 
- setVisible(true); 
- }  
- public static void main(String args[]) 
- { 
- new Program(); 
- } 
-} 
-</code> 
- 
-A ComboBox alapértelmezett magassága 24 pont. 
- 
- 
-<code java> 
-combo.removeAllItem(); 
-</code> 
- 
-Ha kiválasztott változott: 
-<code java> 
-import java.awt.event.ItemEvent; 
-import java.awt.event.ItemListener; 
- 
-... 
- 
-comboBox.addItemListener(new ItemListener() 
-{ 
- public void itemStateChanged(ItemEvent e) 
- { 
- 
- } 
-}); 
-</code> 
- 
- 
-Ha kiválasztunk egy elemet, akkor az esemény kétszer váltódik ki.  
-Az e.getStateChange() először 2, majd 1-et ad vissza. Ez alapján 
-szétválaszthatjuk a két eseményt: 
-<code java> 
-groupComboBox.addItemListener(new ItemListener() 
-{ 
- public void itemStateChanged(ItemEvent e) 
- { 
- if(e.getStateChange()==2)  
- ; //Csinálunk valamit 
- } 
-}); 
-</code> 
- 
- 
-<code java> 
-int a = lld.getItemCount(); 
-int b = lld.getSelectedIndex();  
-</code> 
- 
-Adott elem lekérése: 
-<code java> 
-if(lld.getItemCount()>0) 
-    String str = (String) lld.getSelectedItem(); 
-</code> 
- 
-A getSelectedItem() metódus Object típust ad vissza.  
- 
-===== Rádiógomb ===== 
- 
-==== Egyszerű rádiógomb ==== 
- 
-<code java Program.java> 
-import javax.swing.*; 
-import java.awt.*; 
- 
-class Program extends JFrame 
-{ 
- ButtonGroup group; 
- JRadioButton radio1; 
- JRadioButton radio2; 
- JPanel panel; 
- Program() 
- { 
- group = new ButtonGroup(); 
- radio1 = new JRadioButton("Első"); 
- radio2 = new JRadioButton("Második"); 
- panel = new JPanel(); 
-  
- group.add(radio1); 
- group.add(radio2); 
- panel.add(radio1); 
- panel.add(radio2); 
- add(panel); 
-  
- panel.setBorder(BorderFactory.createTitledBorder("Valami")); 
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
- setSize(300, 200); 
- setVisible(true); 
- }  
- public static void main(String args[]) 
- { 
- new Program(); 
- } 
-} 
-</code> 
- 
-A rádiógombokat, hozzá kell adni a ButtonGroup objektumhoz is, de ez csak csoportosításra szolgál! 
-A megjelenés érdekében a JPanel objektumhoz is hozzá kell adni. 
-Persze a csoportosításnak csak akkor van értelme, ha több csoportunk is van.  
- 
-==== Csoportok ==== 
- 
- 
- 
-<code java Program.java> 
-import javax.swing.*; 
-import java.awt.*; 
- 
-class Program extends JFrame 
-{ 
- ButtonGroup group1; 
- ButtonGroup group2; 
- 
- JRadioButton[] radio1; 
- JRadioButton[] radio2; 
- 
- JPanel panel1; 
- JPanel panel2; 
- Program() 
- { 
- group1 = new ButtonGroup(); 
- group2 = new ButtonGroup(); 
-  
- String[] s1 = {"Első", "Második", "Harmadik", "Negyedik", "Ötödik", "Hatodik"}; 
- String[] s2 = {"1", "2", "3", "4", "5", "6"}; 
- radio1 = new JRadioButton[6]; 
- radio2 = new JRadioButton[6]; 
- panel1 = new JPanel(); 
- panel2 = new JPanel(); 
-  
- for(int i=0; i<6;i++) 
- { 
- radio1[i] = new JRadioButton(s1[i]); 
- group1.add(radio1[i]); 
- panel1.add(radio1[i]); 
- radio2[i] = new JRadioButton(s2[i]);  
- group2.add(radio2[i]); 
- panel2.add(radio2[i]); 
- } 
-  
- panel1.setLayout(new GridLayout(3, 2)); 
- panel2.setLayout(new GridLayout(3, 2));  
- 
- add(panel1); 
- add(panel2); 
-  
- panel1.setBorder(BorderFactory.createTitledBorder("Színek")); 
- panel2.setBorder(BorderFactory.createTitledBorder("Vastagság")); 
-  
- setLayout(new FlowLayout()); 
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
- setSize(300, 200); 
- setVisible(true); 
- }  
- public static void main(String args[]) 
- { 
- new Program(); 
- } 
-} 
-</code> 
-Az utóbbi példában már tömbként hozzuk létre a rádiógombokat.  
- 
-==== Rádiógomb panel osztállyal ==== 
- 
-Hosszútávon jobban járunk, ha a panelt külön osztályba rakjuk: 
- 
-<code java Program.java> 
-import javax.swing.*; 
-import java.awt.*; 
- 
-class SajatPanel extends JPanel 
-{ 
- ButtonGroup group; 
- JRadioButton[] radio; 
- 
- SajatPanel(String[] felirat) 
- { 
- group = new ButtonGroup(); 
-  
- radio = new JRadioButton[6];  
- for(int i=0; i<6;i++) 
- { 
- radio[i] = new JRadioButton(felirat[i]); 
- group.add(radio[i]); 
- add(radio[i]); 
- }  
- }  
-} 
- 
-class Program extends JFrame 
-{ 
- 
- SajatPanel panel1; 
- SajatPanel panel2; 
- Program() 
- { 
- String[] s1 = {"Első", "Második", "Harmadik", "Negyedik", "Ötödik", "Hatodik"}; 
- String[] s2 = {"1", "2", "3", "4", "5", "6"}; 
-  
- panel1 = new SajatPanel(s1); 
- panel2 = new SajatPanel(s2); 
-  
- panel1.setLayout(new GridLayout(3, 2)); 
- panel2.setLayout(new GridLayout(3, 2));  
- 
- add(panel1); 
- add(panel2); 
-  
- panel1.setBorder(BorderFactory.createTitledBorder("Színek")); 
- panel2.setBorder(BorderFactory.createTitledBorder("Vastagság")); 
-  
- setLayout(new FlowLayout()); 
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
- setSize(300, 200); 
- setVisible(true); 
- }  
- public static void main(String args[]) 
- { 
- new Program(); 
- } 
-} 
-</code> 
  
 ===== Szöveghely ===== ===== Szöveghely =====
Sor 2863: Sor 3397:
 ===== Színezés ===== ===== Színezés =====
  
-Egy címkét színezünk a példaprogramban:+Egy feliratot színezünk a példaprogramban:
  
 <code java Program.java> <code java Program.java>
Sor 2889: Sor 3423:
  
  
-címke hátterének színezése:+felirat hátterének színezése:
  
 <code java Program.java> <code java Program.java>
Sor 2926: Sor 3460:
  
 Tulajdonképpen egy panelra tesszük, és azt színezzük.  Tulajdonképpen egy panelra tesszük, és azt színezzük. 
 +
 +{{:oktatas:programozas:java:javaswing_felirathattere.png|}}
 +
 +
  
 ===== Fontok ===== ===== Fontok =====
  
 +A fontok beállításához a java.awt.Font osztályt használjuk. 
 +A példában, egy JLabel objektumon alkalmazzuk a beállításokat. 
 +A Font osztályból egy névtelen példányt fogunk hívni.
  
 <code java Program.java> <code java Program.java>
Sor 2956: Sor 3497:
 </code> </code>
  
 +{{:oktatas:programozas:java:javaswing_font.png|}}
 +
 +
 +
 +Monospace font:
 +<code java>
 +cimke.setFont(new Font(Font.MONOSPACED, Font.BOLD, 20));
 +</code>
  
 ===== Igazítás ===== ===== Igazítás =====
Sor 2989: Sor 3538:
  
 </code> </code>
 +
 +{{:oktatas:programozas:java:jlabel_center.png|}}
 +
 +
 ===== Másik ablak ===== ===== Másik ablak =====
  
Sor 3223: Sor 3776:
  }  }
 } }
 +</code>
 +
 +
 +<code java>
 +// Szegély törlése:
 +this.button1.setBorder(BorderFactory.createEmptyBorder());
 +
 +//A tartalom (kép) töltse ki a gombot:
 +this.button1.setContentAreaFilled(false);
 </code> </code>
  
Sor 3896: Sor 4458:
   * javax.swing.SprintLayout   * javax.swing.SprintLayout
  
 +==== java.awt.FlowLayout ====
  
-==== javax.swing.BoxLayout ====+<code java MainFrame.java> 
 +import java.awt.FlowLayout;
  
 +import javax.swing.JButton;
 +import javax.swing.JFrame;
 +
 +public class MainWindow extends JFrame {
 +    JButton button1 = new JButton("gomb1");
 +    JButton button2 = new JButton("gomb2");
 +    JButton button3 = new JButton("gomb3");
 +
 +    public MainWindow() {
 +        this.setLayout(new FlowLayout());
 +        this.add(button1);
 +        this.add(button2);
 +        this.add(button3);
 +        this.setTitle("FlowLayout");
 +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +        this.pack();
 +        this.setVisible(true);
 +    }    
 +}
 +
 +</code>
 +
 +{{:oktatas:programozas:java:flowlayout.png|}}
 +
 +
 +==== javax.swing.BoxLayout ====
  
 <code java Program01.java> <code java Program01.java>
Sor 3931: Sor 4521:
 } }
 </code> </code>
 +
 +{{:oktatas:programozas:java:boxlayout01.png|}}
  
  
Sor 3966: Sor 4558:
 </code> </code>
  
 +{{:oktatas:programozas:java:boxlayout_panel01.png|}}
  
  
 +Függőlegesen:
 +
 +<code java Program01.java>
 +import javax.swing.JFrame;
 +import javax.swing.JButton;
 +import javax.swing.BoxLayout;
 +import javax.swing.JPanel;
 + 
 +class Program01 extends JFrame
 +{
 + JButton gomb1 = new JButton("Első");
 + JButton gomb2 = new JButton("Második");
 + JButton gomb3 = new JButton("Harmadik");
 + JPanel panel = new JPanel();
 + Program01()
 + {
 + 
 + //PAGE_AXIS, X_AXIS, Y_AXIS, LINE_AXIS
 + panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS) );
 + panel.add(gomb1);
 + panel.add(gomb2);
 + panel.add(gomb3);
 + add(panel);
 + pack();
 + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 + setVisible(true);
 + }
 + public static void main(String[] args)
 + {
 + new Program01();
 + }
 +}
 +</code>
 +
 +{{:oktatas:programozas:java:boxlayout02.png|}}
  
 ==== GridBagLayout ==== ==== GridBagLayout ====
 +
 +A GridBagLayout egy rugalmas elrendezéskezelő, ami vízszintes, függőlegesen rácsok vagy alapvonal mentén
 +igazítja az összetevőket. A komponenseknek nem szükséges azonos méretűnek lenni. 
 +Minden komponens megjelenési területe egy cella. 
 +
 +Minden komponens igazítását egy GridBagConstraints objektummal végezzük. 
 +
 +Minden komponensnek van egy [[https://docs.oracle.com/javase/8/docs/api/java/awt/ComponentOrientation.html|alapértelmezett tájolása]].
 +
 +
  
 <code java> <code java>
Sor 3989: Sor 4627:
  
 === gridx, gridy === === gridx, gridy ===
-Sorok és oszlopok megadása. +Sorok és oszlopok megadása. Megmondjuk melyik cellába tesszük a komponenst
  
 Az első mező címe: gridx=0 Az első mező címe: gridx=0
Sor 3997: Sor 4635:
  
 === gridwidth, gridheight === === gridwidth, gridheight ===
-Az oszlopok és sorok szélessége és magassága.+Az oszlopok és sorok szélessége és magassága. Egy cella hány cellán nyúljon keresztül.
  
-  * előtt lévő sorral egyezen meg: GridBagConstraints.REMAINDER+  * Az előtt lévő sorral egyezzen meg: GridBagConstraints.REMAINDER
   * GridBagConstraints.RELATIVE   * GridBagConstraints.RELATIVE
-  * +
  
 === fill === === fill ===
Sor 4038: Sor 4676:
   * 0.0 (alapértelmezett)   * 0.0 (alapértelmezett)
   * 1.0   * 1.0
 +
 +
 +=== Első példa ===
 +
 +<code java MainFrame.java>
 +
 +import java.awt.GridBagConstraints;
 +import java.awt.GridBagLayout;
 +
 +import javax.swing.JButton;
 +import javax.swing.JFrame;
 +
 +public class MainWindow extends JFrame {
 +    JButton button1 = new JButton("gomb1");
 +    JButton button2 = new JButton("gomb2");
 +    JButton button3 = new JButton("gomb3");
 +
 +    GridBagLayout layout = new GridBagLayout();
 +    GridBagConstraints c = new GridBagConstraints();
 +
 +    public MainWindow() {
 +        this.setLayout(new GridBagLayout());
 +
 +        this.c.fill = GridBagConstraints.HORIZONTAL;
 +        this.c.gridx = 0;
 +        this.c.gridy = 0;        
 +        this.add(button1, c);
 +
 +        this.c.gridx = 1;
 +        this.c.gridy = 0;        
 +        this.add(button2, c);
 +
 +        this.c.gridx = 0;
 +        this.c.gridy = 2;
 +        this.c.gridwidth = 2;
 +        this.add(button3, c);
 +
 +        this.setTitle("GridBagLayout");
 +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +        this.pack();
 +        this.setVisible(true);
 +    }
 +}
 +</code>
 +
 +{{:oktatas:programozas:java:gridbaglayout_01.png|}}
 +
 +
 +=== Példa 02 ===
 +
 +
 +<code java MainFrame.java>
 +
 +import java.awt.GridBagConstraints;
 +import java.awt.GridBagLayout;
 +
 +import javax.swing.JButton;
 +import javax.swing.JFrame;
 +
 +public class MainWindow extends JFrame {
 +    JButton button1 = new JButton("gomb1");
 +    JButton button2 = new JButton("gomb2");
 +    JButton button3 = new JButton("gomb3");
 +    JButton button4 = new JButton("gomb4");
 +    JButton button5 = new JButton("gomb5");
 +
 +    GridBagLayout layout = new GridBagLayout();
 +    GridBagConstraints c = new GridBagConstraints();
 +
 +    public MainWindow() {
 +        this.setLayout(new GridBagLayout());
 +
 +        this.c.fill = GridBagConstraints.HORIZONTAL;
 +        this.c.gridx = 0;
 +        this.c.gridy = 0;        
 +        this.add(button1, c);
 +
 +        this.c.gridx = 1;
 +        this.c.gridy = 0;        
 +        this.add(button2, c);
 +
 +        this.c.gridx = 2;
 +        this.c.gridy = 0;
 +        this.add(button3, c);
 +
 +        this.c.gridx = 0;
 +        this.c.gridy = 1;        
 +        this.c.gridwidth = 3;
 +        this.add(button4, c);
 +
 +        this.c.gridx = 0;
 +        this.c.gridy = 2;
 +        this.c.gridwidth = 3;
 +        this.c.ipady = 40;   
 +        this.add(button5, c);
 +
 +        this.setTitle("GridBagLayout");
 +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +        this.pack();
 +        this.setVisible(true);
 +    }
 +}
 +</code>
 +
 +{{:oktatas:programozas:java:gridbaglayout_02.png|}}
 +
 +
  
 === További információk === === További információk ===
  
-  * http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html+  * https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html 
 +  * https://docs.oracle.com/javase/8/docs/api/java/awt/GridBagConstraints.html 
 +  * https://docs.oracle.com/javase/8/docs/api/java/awt/ComponentOrientation.html 
 +  * https://docs.oracle.com/javase/8/docs/api/java/awt/GridBagLayout.html
  
  
Sor 4062: Sor 4810:
 <code java> <code java>
 button = new JButton("Button 3 (LINE_START)"); button = new JButton("Button 3 (LINE_START)");
 +pane.setLayout(new BorderLayout());
 pane.add(button, BorderLayout.LINE_START); pane.add(button, BorderLayout.LINE_START);
 </code> </code>
  
-  * PAGE_START +  * BorderLayout.PAGE_START, BorderLayout.NORTH 
-  * PAGE_END +  * BorderLayout.PAGE_END, BorderLayout.SOUTH 
-  * LINE_START +  * BorderLayout.LINE_START, BorderLayout.WEST 
-  * LINE_END +  * BorderLayout.LINE_END, BorderLayout.EAST 
-  * CENTER+  * BorderLayout.CENTER 
 + 
 + 
 +<code java MainFrame.java> 
 +import java.awt.BorderLayout; 
 + 
 +import javax.swing.JButton; 
 +import javax.swing.JFrame; 
 + 
 +public class MainWindow extends JFrame { 
 +    JButton button1 = new JButton("gomb1"); 
 +    JButton button2 = new JButton("gomb2"); 
 +    JButton button3 = new JButton("gomb3"); 
 +    JButton button4 = new JButton("gomb4"); 
 +    JButton button5 = new JButton("gomb5"); 
 + 
 +    public MainWindow() { 
 +        this.setLayout(new BorderLayout()); 
 +        this.add(button1, BorderLayout.NORTH); 
 +        this.add(button2, BorderLayout.EAST); 
 +        this.add(button3, BorderLayout.SOUTH); 
 +        this.add(button4, BorderLayout.WEST); 
 +        this.add(button5, BorderLayout.CENTER); 
 + 
 +        this.setTitle("BorderLayout"); 
 +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 +        this.pack(); 
 +        this.setVisible(true); 
 +    }     
 +
 + 
 +</code> 
 + 
 +{{:oktatas:programozas:java:borderlayout.png|}}
  
  
Sor 4075: Sor 4857:
  
  
-==== GridLayout ==== 
  
 +==== GridLayout ====
  
 +Importálás:
 <code java> <code java>
 import java.awt.GridLayout; import java.awt.GridLayout;
Sor 4093: Sor 4876:
  
  
-4 sor és 3 oszlopos példa: 
  
-<code java Program01.java> + 
-import javax.swing.JFrame; +<code java MainFrame.java> 
-import javax.swing.JButton;+
 import java.awt.GridLayout; import java.awt.GridLayout;
  
-class Program01 extends JFrame +import javax.swing.JButton; 
-+import javax.swing.JFrame; 
- JButton[] buttons+ 
- Program01() +public class MainWindow extends JFrame { 
- +    JButton button1 = new JButton("gomb1")
- buttons = new JButton[12]+    JButton button2 = new JButton("gomb2"); 
- for(int i=0; i<12; i+++    JButton button3 = new JButton("gomb3")
- +    JButton button4 new JButton("gomb4"); 
- buttons[i] = new JButton(); +    JButton button5 = new JButton("gomb5"); 
- buttons[i].setText(Integer.toString(i)); +    JButton button6 = new JButton("gomb6"); 
- add(buttons[i]); +    JButton button7 = new JButton("gomb7");     
- } + 
-  +    public MainWindow() { 
- setLayout(new GridLayout(4, 3)); +        this.setLayout(new GridLayout(4, 2)); 
-  +        this.add(button1); 
- pack(); +        this.add(button2); 
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); +        this.add(button3); 
- setVisible(true); +        this.add(button4); 
- }  +        this.add(button5); 
- public static void main(String[] args+        this.add(button6); 
- { +        this.add(button7); 
- new Program01(); + 
- }+        this.setTitle("GridLayout"); 
 +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 +        this.pack(); 
 +        this.setVisible(true); 
 +    }
 } }
 </code> </code>
  
-De panelon is használhatjuk a GridLayout elrendezéskezelőt:+{{:oktatas:programozas:java:gridlayout.png|}}
  
-<code java Program01.java>+==== java.awt.CardLayout ==== 
 + 
 +A CardLayout esetén az elemek egymás felett helyezkednek el. 
 +Az elrendezés kezelő példányán keresztül léptethetünk a  
 +komponensek között.  
 + 
 +<code java MainFrame.java> 
 +import java.awt.CardLayout; 
 + 
 +import javax.swing.JButton;
 import javax.swing.JFrame; import javax.swing.JFrame;
-import javax.swing.JButton; 
-import javax.swing.JPanel; 
-import javax.swing.JTextField; 
-import java.awt.GridLayout; 
-import javax.swing.BoxLayout; 
  
-class Program01 extends JFrame +public class MainWindow extends JFrame { 
-+    JButton button1 = new JButton("gomb1"); 
- JButton[] buttons; +    JButton button2 = new JButton("gomb2"); 
- JPanel buttonsPanel; +    JButton button3 = new JButton("gomb3")
- JTextField displayTextField; +    CardLayout card = new CardLayout(50, 100); 
- Program01() + 
-+    public MainWindow() { 
- buttonsPanel = new JPanel(); +        this.button1.addActionListener(e->onClickButton()); 
- displayTextField = new JTextField(); +        this.button2.addActionListener(e->onClickButton()); 
-  +        this.button3.addActionListener(e->onClickButton()); 
- buttons = new JButton[12]; +        this.setLayout(card); 
- for(int i=0i<12; i++) +        this.add(button1); 
- +        this.add(button2); 
- buttons[i] = new JButton(); +        this.add(button3); 
- buttons[i].setText(Integer.toString(i)); + 
- buttonsPanel.add(buttons[i]); + 
- +        this.setTitle("CardLayout"); 
-  +        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
- buttonsPanel.setLayout(new GridLayout(4, 3)); +        this.pack(); 
- setLayout(new BoxLayout(getContentPane() +        this.setVisible(true); 
- BoxLayout.Y_AXIS)); +    
- add(displayTextField); +    private void onClickButton() { 
- add(buttonsPanel); +        this.card.next(this.getContentPane()); 
- pack(); +    }
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); +
- setVisible(true); +
- }  +
- public static void main(String[] args) +
- +
- new Program01(); +
- }+
 } }
 +
 </code> </code>
  
  
- +{{:oktatas:programozas:java:cardlayout.png|}}
 ===== TrayIcon ===== ===== TrayIcon =====
  
Sor 4294: Sor 5077:
 } }
 </code> </code>
 +
 +{{:oktatas:programozas:java:javaswingjtoolbar_01.png|}}
  
  
 Esetleg készítsünk egy saját eszköztár osztályt: Esetleg készítsünk egy saját eszköztár osztályt:
-<code java> +<code java MyToolbar.java> 
-public class myToolbar extends JToolBar  +import javax.swing.JToolBar; 
-+import java.awt.Color; 
-    public myToolbar()  +import javax.swing.JButton; 
-    {+ 
 +class MyToolbar extends JToolBar { 
 +    public MyToolbar() { 
 +        JButton button = new JButton("Felirat"); 
 +         
 +        add(button); 
 +        button.setToolTipText("Szövege");
         setName("Eszköztár");         setName("Eszköztár");
         setBackground(new Color(245, 245, 245));         setBackground(new Color(245, 245, 245));
Sor 4310: Sor 5101:
     }     }
 } }
 +</code>
 +
 +<code java Program01.java>
 +import javax.swing.JFrame;
 +import java.awt.BorderLayout;
 + 
 +class Program01 extends JFrame {
 +    MyToolbar toolBar = new MyToolbar();
 +    Program01() {
 +        add(toolBar, BorderLayout.NORTH);
 +        setSize(400, 300);
 +        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +        setVisible(true);
 +    }
 +    public static void main(String[] args) {
 +        new Program01();
 +    }
 +}
 +
 </code> </code>
  
Sor 4523: Sor 5333:
 ===== Fókusz ===== ===== Fókusz =====
  
-Az ablakos program esetén mindig van egy ablakunk, amelyet frame-nek is szoktunk nevezni.+A GUI programnak általában van egy ablaka, amelyet frame-nek is szoktunk nevezni.
 Az ablakon komponenseket helyezünk el, amelyek közül egy mindig fókuszban van. Az ablakon komponenseket helyezünk el, amelyek közül egy mindig fókuszban van.
-A fókusz alatt értjük, hogy aktívvá válik, kissé megváltozik a színezete, stb.  +A fókusz alatt értjük, hogy aktívvá válik, kissé megváltozik a színezete,  
-Mindig a fókuszban lévő komponensen tudunk egy billentyűnyomást figyelni+abba írhatunk, vagy vezérelhetjük billentyűkkel stb
  
-Ha azt szeretnénk, hogy mindig figyeljünk bizonyos billentyűket, akkor a fókuszt  +Ha billentyűnyomásokat szeretnénk figyelniazt csak a fókuszban 
-tegyük mindig vissza az ablakra:+lévő komponensen tudjuk alapesetben. Ha minden komponensnél 
 +figyelni szeretnénk egy billentyűkombinációt, akkor azt az  
 +ablakon kell figyeltetni. 
  
  
 +A fókusz átadása az egész ablaknak:
 <code java> <code java>
 this.requestFocus(); this.requestFocus();
Sor 4594: Sor 5407:
  
  
 +===== Komponensek helyzete =====
 +
 +<code java>
 +    public void move() {
 +        int x = this.button1.getLocation().x;
 +        int y = this.button1.getLocation().y;
 +        this.button1.setLocation(x+100, y);
 +    }
 +</code>
  
 ===== Függelék ===== ===== Függelék =====
Sor 4838: Sor 5660:
 ===== Külső link ===== ===== Külső link =====
   * https://docs.oracle.com/javase/tutorial/uiswing/ (2019)   * https://docs.oracle.com/javase/tutorial/uiswing/ (2019)
-  http://movingtofreedom.org/2007/11/11/displaying-a-scaled-image-in-java/ (Skálázható kép; 2019)+    https://docs.oracle.com/javase/tutorial/uiswing/components/ (2021)
   * http://mindprod.com/jgloss/image.html (Minden ami kép; 2019)   * http://mindprod.com/jgloss/image.html (Minden ami kép; 2019)
   * http://download.oracle.com/javase/tutorial/uiswing/components/list.html (JList; 2019)   * http://download.oracle.com/javase/tutorial/uiswing/components/list.html (JList; 2019)
   * http://download.oracle.com/javase/tutorial/uiswing/components/toplevel.html (2019)   * http://download.oracle.com/javase/tutorial/uiswing/components/toplevel.html (2019)
-  * http://asjava.com/category/swing/ (2019) 
   * http://zetcode.com/gfx/java2d/   * http://zetcode.com/gfx/java2d/
   * https://www.logicbig.com/tutorials/java-swing.html (2019)   * https://www.logicbig.com/tutorials/java-swing.html (2019)
   * https://www.javacodex.com/More-Examples/2/11 (2019)   * https://www.javacodex.com/More-Examples/2/11 (2019)
 +  * https://www3.ntu.edu.sg/home/ehchua/programming/java/J4a_GUI_2.html (2023)
  
oktatas/programozas/java/java_gui_swing.1614774709.txt.gz · Utolsó módosítás: 2021/03/03 13:31 szerkesztette: admin