A kiválasztott változat és az aktuális verzió közötti különbségek a következők.
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ás, 2011, 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 | + | A 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 | ||
- | A felírat bármikor újraírható: | + | {{:oktatas:programozas:java:jlabel_gui_swing.png|}} |
+ | |||
+ | |||
+ | A 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ó a 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ély, megmondja, 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. |
- | a 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(100, 100, 300, 200); | + | spanel.setBounds(20, 20, 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(800, 600); | + | this.setSize(400, 300); |
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(100, 100, 300, 200); | + | tabla.setBounds(20, 20, 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(800, 600); | + | setSize(400, 300); |
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: | ||
- | A címke hátterének színezése: | + | A 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. |
- | * A 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=0; i<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 figyelni, azt 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) | ||