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 oldalon Előző változat
Következő változat
Előző változat
oktatas:programozas:java:java_gui_swing [2021/03/03 13:31]
admin [Felirat]
oktatas:programozas:java:java_gui_swing [2024/04/16 18:46] (aktuális)
admin [Külső link]
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