Upload
dangmien
View
272
Download
0
Embed Size (px)
Citation preview
2015/10/31 01:12 1/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
< Java
Java GUI Swing csomaggal
Szerző: Sallai AndrásCopyright © Sallai András, 2011, 2012, 2013, 2014, 2015Licenc: GNU Free Documentation License 1.3Web: http://szit.hu
Bevezetés
Ennek a fejezetnek a megvalósításához feltételezem a Java alapismereteket és a Javaobjektumorientá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 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 azoperációs rendszer ablakkezelőjére bízza, minden operációs rendszeren. Ennek eredménye, hogyugyanaz a program másként néz ki Windowson, Linuxon, MacOSX-en vagy más rendszeren. A Swingeszközkészletet úgy alakították ki, hogy maga határozza meg hogyan nézzen ki a program ablaka. Ígyegységes kinézetet kapunk minden operációs rendszeren.
Ablak
Első program
A Java alapismeretek alapján, az első programunk, amely egy ablakot jelenít meg az alábbiak szerintnézhet ki.
Program.java
import javax.swing.JFrame; class Program{ public static void main(String args[]) { JFrame ablak = new JFrame(); ablak.setSize(400, 300); ablak.setVisible(true); }}
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
A fenti program egy szimpla ablakot valósít meg, amelynek a mérete 400×300-as.
Az első program elemzése
Az ablak létrehozásához JFrame osztályt használjuk, így programban importáljuk azt, amely egyablakot valósít meg:
import javax.swing.JFrame;
A programban egy ablak nevű objektumot deklarálunk:
JFrame ablak
és rögtön helyet is foglalunk számára:
new JFrame();
A következő utasítás beállítja az ablak méretét:
ablak.setSize(400, 300);
A következő utasítás megjeleníti az ablakot. Ennek az utasításnak az utolsónak kell lenni.
ablak.setVisible(true);
A programunk magját tulajdonképpen a main() metódusban hoztuk létre, hagyományos módon:
JFrame ablak = new JFrame();ablak.setSize(400, 300);ablak.setVisible(true);
Második program
A második programunk eredménye mindenben megegyezik az előzővel, viszont másként valósítottukmeg. Kihasználjuk a Java objektum orientált tulajdonságait, és a megvalósításhoz az öröklésthasználjuk.
Program.java
import javax.swing.JFrame; class Program extends JFrame{ Program() { setSize(400, 300); setVisible(true);
2015/10/31 01:12 3/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
} public static void main(String args[]) { new Program(); }}
Ugyanez NetBeans rendszerben:
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(); }}
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 NetBeansforrásprogramjában van a forráskód elején egy package program; nevű sor.
A második program elemzése
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
Az első sor ugyanúgy importálja a JFrame osztályt mint az első programunk.
A főosztályunkban viszont most látunk egy „extends JFrame” kiegészítést. Az „extends” arra adutasítást, hogy a JFrame összes tulajdonságát és metódusát átörökítjük a Program osztályunkszámára. Ettől kezdve a Program osztály úgy viselkedik mint egy JFrame objektum. Aprogramosztályon futtatható az összes metódus amivel rendelkezik a JFrame osztály. Ilyen metódus apéldában szereplő setSize() és setVisible() metódus is.
Program(){ setSize(400, 300); setVisible(true);}
A Program osztályon belül létre kell hozni egy speciális metódust, a „konstruktort”! Az objektumorientált tanulmányaikból tudhatjuk, hogy ennek meg kell egyeznie az osztály nevével. A példábanennek megfelelően egy Program() nevű konstruktort hoztunk létre a main() metódus előtt.
Az ablakunk beállításit ebben a konstruktorban adom meg. Lásd
setSize(400, 300);setVisible(true);
Ahhoz, hogy a program elinduljon a main() metódusban meg kell hívnunk a konstruktorunkat:
new Program();
JLabel
Felirat
A következő programunk ablakára egy feliratot fogunk elhelyezni, amit a JLabel osztállyal valósítunkmeg.
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); setSize(400, 300); setVisible(true); }
2015/10/31 01:12 5/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
public static void main(String args[]) { new Program(); }}
Létrehoztunk egy felirat nevű objektumot a JLabel osztályból. Vegyük észre, hogy ezt a konstruktorelőtt deklaráltuk, de az objektumnak a helyfoglalást a konstruktoron belül valósítottuk meg.Ugyanakkor a konstruktornak paraméterként megadtuk a felírat szövegét, amely persze nemkötelező.
Az ablakhoz hozzáadtuk a felirat nevű objektumot:
add(felirat);
A program elején van két import kezdetű sor. Az első a JFrame osztályt importálja:
import javax.swing.JFrame;
A második a JLabel osztályt:
import javax.swing.JLabel
A felírat bármikor újraírható:
label1.setText("Másik felirat");
Ha a JLabel komponens háttérszínét szeretnénk változtatni, akkor előtte szükséges a setOpaque():
label1.setOpaque(true);label1.setBackground(Color.blue);label1.setForeground(Color.WHITE);
import javax.swing.SwingConstants;...//RIGHT, LEFT, CENTERlabel1.setHorizontalAlignment(SwingConstants.CENTER);//TOP, BOTTOM, CENTERlabel1.setVerticalAlignment(SwingConstants.TOP);
Ablak automatikus méretezése
Program.java
import javax.swing.JFrame;import javax.swing.JLabel;class Program extends JFrame{
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
JLabel felirat; Program() { felirat = new JLabel("Helló Világ!"); add(felirat); pack(); setVisible(true); } public static void main(String args[]) { new Program(); }}
Vegyük észre a pack() utasítást a konstruktorban. Ugyanakkor kivettük a setSize() metódust. A pack()metódus a komponens méretéhez igazítja az ablakméretét.
Komponensek elhelyezése
Az ablak egyes komponenseit elhelyezhetjük koordináták megadásával is. Ha így dolgozunk, be kellállítani a komponens szélességét és magasságát is. Ez megtehetjük a setBounds() metódussal. Azelrendezéskezelést azonban ki kell kapcsolni a setLayout() metódussal.
Program.java
import javax.swing.JFrame;import javax.swing.JLabel;class Program extends JFrame{ JLabel felirat; Program() { felirat = new JLabel("Helló Világ!"); felirat.setBounds(50, 50, 100, 30); setLayout(null); add(felirat); setSize(400, 300); setVisible(true); } public static void main(String args[]) { new Program(); }}
Vegyük észre a setLayout() utasítást a konstruktorban. Ugyanakkor vissza tettük a setSize()metódust.
2015/10/31 01:12 7/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
Ablakbezárás esemény kezelése
DefaultCloseOperation()
A grafikus programok eseményvezéreltek. A program folyamatosan fut, és eseményekbekövetkezését várja. Ilyen események az egérkattintás és a billentyűzetnyomás, egy komponensvalamely tulajdonságának megváltozása, stb. Egy normál alkalmazás ablak címsorában van egybezárás gomb „X”, egy minimalizálás és egy maximalizálás gomb. A bezárás gombra kattintvakivá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őtadunk az ablakhoz, amely megvalósítja a program befejezését, ha erre az ikonra kattint a felhasználó.
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(); }}
Az újabb sor amit hozzáadtunk a programunkhoz:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Az EXIT_ON_CLOSE a JFrame osztály egy mezője, amely valójában egy számállandó. Ha ezt aszámállandót adjuk meg a setDefaultClsoeOperation() metódus paramétereként, akkor a programkilé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.
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
A setDefaultCloseOperation argumentumaként más értékeket is beállíthatunk.
ablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Négy érték állítható be JFrame, JInternalPane és JDialog esetén:
DO_NOTHING_ON_CLOSENem csinál semmit ablak bezárásra kattintva. A WindowsListener segítségével máshatá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.
Az ablak helyének megadása
A következő programban azt szemléltetjük, hogyan határozzuk meg az ablak helyét saját magunk.Ehhez a setLocation() metódust használhatjuk:
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(); setLocation(200, 200); setVisible(true); } public static void main(String args[]) { new Program(); }}
A setLocation() metódusnak két paramétere van. A két száma az ablak helyéenk x és y koordinátája aképernyőn.
2015/10/31 01:12 9/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
Ablak középre igazítása
Ez az ablak bal felső sarkát teszi középre:
ablak.setLocationRelativeTo(null);
Ezért írjunk hozzá egy metódust:
public static void centerWindow(java.awt.Window frame) { java.awt.Dimension dimension =java.awt.Toolkit.getDefaultToolkit().getScreenSize(); int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2); int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2); frame.setLocation(x, y);}
Program.java
import java.awt.*;import javax.swing.*; class Program5{ JFrame ablak; JLabel cimke1; JLabel cimke2; public static void main(String args[]) { new Program5(); } Program5() { ablak = new JFrame("Címke"); cimke1 = new JLabel("Első címke"); cimke2 = new JLabel("Második címke"); cimke1.setBounds(10, 10, 100, 30); cimke2.setBounds(10, 40, 100, 30); //ablak.setBounds(10, 40, 800, 600); ablak.setSize(800, 600); centerWindow(ablak); ablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ablak.setLayout(null);
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
ablak.add(cimke1); ablak.add(cimke2); ablak.setVisible(true); } public static void centerWindow(Window frame) { Dimension dimension =Toolkit.getDefaultToolkit().getScreenSize(); int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2); int y = (int) ((dimension.getHeight() - frame.getHeight()) /2); frame.setLocation(x, y); }}
Másik módszer:
public void setCenter(javax.swing.JFrame window) { java.awt.Point center =java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint(); int x =(int) center.getX() - (this.getWidth()/2); int y =(int) center.getY() - (this.getHeight()/2); java.awt.Point windowCenter = new java.awt.Point(x, y); window.setLocation(windowCenter);}
Középre igazítás külön metódusban:
Program.java
import javax.swing.JFrame;import javax.swing.JLabel;import java.awt.FlowLayout;import java.awt.GraphicsEnvironment;import java.awt.Point;class Program extends JFrame{ JLabel felirat1; JLabel felirat2; Program() { felirat1 = new JLabel("Első címke"); felirat2 = new JLabel("Második címke"); add(felirat1); add(felirat2);
2015/10/31 01:12 11/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
setLayout(new FlowLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 200); setCenter(this); //Fontos, hogy a méretezés után hívjuk meg setVisible(true); } void setCenter(JFrame ablak) { Point center =GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint(); int x =(int) center.getX() - (ablak.getWidth()/2); int y =(int) center.getY() - (ablak.getHeight()/2); Point ablakCenter = new Point(x, y); ablak.setLocation(ablakCenter); } public static void main(String args[]) { new Program(); }}
Méretezés, hely
A méretezés és helymeghatározásra a setBounds() metódust használhatjuk. Általánosságban asetBounds() paraméterezése:
setBounds(x, y, szelesseg, magassag);
Az x és y koordináta határozza meg, hogy az ablak, vagy egy komponens hova kerüljön. Az xkoordináta az ablak vízszintes helyzetét határozza meg a képernyőn, annak baloldalához képest. Az ykoordináta az ablak függőleges helyzetét határozza meg a képernyőn, annak tetejétől. A „szelesseg”és a „magassag” önmagáért beszél.
Egy objektum helyének meghatározása:
setLocation(50, 50);
Egy objektum mérete:
setSize(400, 300);
Az objektum helye és mérete egyszerre:
setBounds(50, 50, 400, 300);
Az ablak átméretezésének tiltása:
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
setResizable(false);
Az ablak és a komponensek méretét el is tárolhatjuk a Dimension osztály segítségével:
import java.awt.Dimension;
Használata a következő módon lehetséges:
Dimension meret = new Dimension(400, 300);setSize(meret);
Dimension meret = new Dimension();meret.width = 400;meret.height = 300;setSize(meret);
A helyeket is eltárolhatjuk a java.awt.Point osztály segítségével:
Point hely = new Point();hely.x = 50;hely.y = 50;setLocation(hely);
A hely és a méret egyszerre is eltárolható a java.awt.Rectangle osztály segítségével:
Rectangle teglalap = new Rectangle();teglalap.x = 50;teglalap.y = 50;teglalap.width = 400;teglalap.height = 300;setBounds(teglalap);setVisible(true);
Több komponens
Itt az ideje, hogy több komponenst is hozzáadjunk az ablakunkhoz. A komponens kettő darab címke.Az egyik cimke1 és a cimke2. A szokásos módon mind a kettőt létrehozzuk és helyet foglalunkszámára. Ha fenti kódhoz hozzáillesztünk egy újabb címkét, azt tapasztaljuk, hogy egyik címke rálóg amásikra. Szükség van egy utasításra, amely megmondja, hogy egymás után kell azt megjeleníteni.Ehhez a java.awt.FlowLayout osztályt használhatjuk.
Program.java
import javax.swing.JFrame;import javax.swing.JLabel;import java.awt.FlowLayout;class Program extends JFrame{
2015/10/31 01:12 13/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
JLabel felirat1; JLabel felirat2; Program() { felirat1 = new JLabel("Első címke"); felirat2 = new JLabel("Második címke"); add(felirat1); add(felirat2); setLayout(new FlowLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setLocation(200, 200); setVisible(true); } public static void main(String args[]) { new Program(); }}
A FlowLayout() konstruktorral megmondjuk, hogy a komponenseket egymás után sorba helyezzük el.Ha ezt kihagyjuk, akkor egymásra rakja a komponenseket. Ez viszont az awt csomagban van, ezértimportáljuk azt:
import java.awt.*;
Itt szeretném megjegyezni, hogy ha az awt csomagból csak a FlowLayout osztályt használjuk, akkoraz importálásnál megadhatjuk, hogy csak ezt az osztályt importálom:
import java.awt.FlowLayout;
Abszolút pozíciónálás
A következő programunkban nem használunk elrendezéskezelőt (ablak.setLayout(…)). Akomponensek helyét az ablakon mi magunk fogjuk meghatározni. Ehhez az elrendezéskezelőparamétereként „null” érték kerül átadásra. Így szükségtelen a java.awt.FlowLayout osztályimportálása is.
import javax.swing.JFrame;import javax.swing.JLabel; class Program extends JFrame{ JLabel felirat1; JLabel felirat2; Program() {
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
felirat1 = new JLabel("Első címke"); felirat2 = new JLabel("Második címke"); felirat1.setBounds(50,50, 100, 30); felirat2.setBounds(50,100, 100, 30); setLayout(null); add(felirat1); add(felirat2); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400,300); setVisible(true); } public static void main(String args[]) { new Program(); }}
Vegyük észre, hogy az ablak.setLayout() paramétere most már null:
ablak.setLayout(null);
A komponenseknél meghatározzuk a setBounds() metódussal a helyüket és méretüket.
cimke1.setBounds(50,50, 100, 100);cimke2.setBounds(50,100, 100, 100);
Gomb (JButton)
Alapértelmezett magasság: 25 pont
Program01.java
JButton gomb = new JButton("Klikkelj ide");gomb.setText("Más felirat");gomb.addActionListener(new Gomb_Click());
A java.awt.Insets osztály használható az JButton, JTextField és a JTextArea esetén is.
Belső margó:
nextButton.setMargin(new Insets(10, 10, 10, 10));
2015/10/31 01:12 15/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
Eseménykezelés
ActionPerformed
Az események kezeléséhez ActionListener interfészt használjuk. Az interfész olyan mint az osztály, dea hozzátartozó metódusoknak csak a fejrésze van deklarálva. A metódust törzs részét nekünk kelldefiniálni. Sőt ezt kötelező megtenni.
Az ActionListener interfész arra való, hogy az ablakon különböző eseményeket figyeljünk. AzActionListener interfészt úgy használhatjuk ha az „implements” utasítással utalunk rá. Ezt az osztályneve után írjuk az alábbi formában.
Az actionPerformed() metódus egy ilyen figyelő, amely események bekövetkezését figyeli. AzactionPerformed() metódust tehát nekünk kötelező definiálni. Van egy kötelező paramétere,amelynek kötelezően ActionEvent típus. Az így megadott változóban megvizsgálhatjuk, hogy melyikkomponens váltotta ki az eseményt.
Program.java
import javax.swing.JFrame;import javax.swing.JButton;import java.awt.event.ActionListener;import java.awt.event.ActionEvent; class Program extends JFrame implements ActionListener{ JButton kilepesgomb; Program() { kilepesgomb = new JButton("Kilépés"); kilepesgomb.setBounds(100, 100, 100, 30); kilepesgomb.addActionListener(this); add(kilepesgomb); setLayout(null); setSize(400, 300); setVisible(true); } public void actionPerformed(ActionEvent e) { System.exit(); } public static void main(String args[]) { new Program(); }}
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
A fenti programunkban a gomb1 nyomógombhoz rendelünk egy figyelőt:
gomb1.addActionListener(this);
Az actionPerformed metódus reagál az eseményre:
public void actionPerformed(ActionEvent e){ System.exit();}
Jelenleg csak egyetlen komponenshez rendeltünk eseményfigyelőt, így nem használtuk fel az „e”változót sem, vegyük észre.
Több komponens
Program.java
import javax.swing.JFrame;import javax.swing.JButton;import java.awt.event.ActionListener;import java.awt.event.ActionEvent; class Program extends JFrame implements ActionListener{ JButton kilepesgomb; JButton valtoztatgomb; JButton visszagomb; Program() { kilepesgomb = new JButton("Kilépés"); valtoztatgomb = new JButton("Változtat"); visszagomb = new JButton("Vissza"); kilepesgomb.setBounds(10, 100, 100, 30); kilepesgomb.addActionListener(this); valtoztatgomb.setBounds(120, 100, 100, 30); valtoztatgomb.addActionListener(this); visszagomb.setBounds(230, 100, 100, 30); visszagomb.addActionListener(this); setLayout(null); add(kilepesgomb); add(valtoztatgomb); add(visszagomb); setSize(400, 300); setVisible(true);
2015/10/31 01:12 17/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
} public void actionPerformed(ActionEvent e) { if(e.getSource() == kilepesgomb) System.exit(); if(e.getSource() == valtoztatgomb) setTitle("Működik"); if(e.getSource() == visszagomb) setTitle("Másik"); } public static void main(String args[]) { new Program(); }}
Eseménykezelő névtelen osztállyal
import javax.swing.JFrame;import javax.swing.JButton;import java.awt.event.ActionListener;import java.awt.event.ActionEvent; class Program extends JFrame{ JButton kilepesgomb; Program() { kilepesgomb = new JButton("Kilépés"); kilepesgomb.setBounds(50,100, 100, 30); kilepesgomb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(); } }); setLayout(null); add(kilepesgomb); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400,300); setVisible(true); } public static void main(String args[]) {
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
new Program(); }}
A fenti példában az eseménykezelést névtelen beépített osztállyal valósítjuk meg.
Ezt a megoldást is gyakran használják.
Eseménykezelő beépített osztállyal
Ebben a példában beépített (nested) osztállyal valósítjuk meg az eseménykezelést.
Program.java
import javax.swing.JFrame;import javax.swing.JButton;import java.awt.event.ActionListener;import java.awt.event.ActionEvent; class Program extends JFrame{ JButton kilepesgomb; Program() { kilepesgomb = new JButton("Kilépés"); kilepesgomb.setBounds(50,100, 100, 30); kilepesgomb.addActionListener(new KilepesGomb_Click()); setLayout(null); add(kilepesgomb); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400,300); setVisible(true); } class KilepesGomb_Click implements ActionListener { public void actionPerformed(ActionEvent e) { System.exit(); } } public static void main(String args[]) { new Program(); }}
2015/10/31 01:12 19/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
ExitListener
import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent; public class ExitListener extends WindowAdapter{ public void windowClosing(WindowEvent event) { System.exit(); }}
Szövegdoboz használata
Szövegdobozt a JTextField osztállyal hozhatunk létre. A szöveg doboznak kezdőértéket adhatunk akonstruktorban a Text tulajdonsággal. Például:
TextField1.Text = "Kezdő szöveg";
Később a doboz tartalmát a setText() metódussal állítjuk:
TextField1.setText("Új szöveg");
A doboz tartalmának lekérdezése:
String tartalom = TextField.getText();
A következő példában egy számot várunk, amit megduplázunk.
Program.java
import java.awt.FlowLayout;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import javax.swing.JFrame;import javax.swing.JButton;import javax.swing.JTextField; class Program extends JFrame{ JButton kilepesgomb; JButton duplazasgomb; JTextField szammezo; Program() { kilepesgomb = new JButton("Kilépés");
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
duplazasgomb = new JButton("Dupláz"); szammezo = new JTextField(); kilepesgomb.addActionListener(new KilepesGomb_Click()); duplazasgomb.addActionListener(new DuplazoGomb_Click()); szammezo.setColumns(7); add(kilepesgomb); add(duplazasgomb); add(szammezo); setLayout(new FlowLayout()); pack(); setVisible(true); } class KilepesGomb_Click implements ActionListener { public void actionPerformed(ActionEvent e) { System.exit(); } } class DuplazoGomb_Click implements ActionListener { public void actionPerformed(ActionEvent e) { String szamstr = szammezo.getText(); int szam = Integer.parseInt(szamstr); int eredmeny = szam * 2; szammezo.setText(Integer.toString(eredmeny)); } } public static void main(String args[]) { new Program(); }}
Alapértelmezett magasság: 19 pont.
setHorizontalAlignment(JTextField.CENTER);
JTextField beállítások
textField1.setEditable(false);
textField1.setHorizontalAlignment(JTextField.LEFT);
JTextField.LEFT
2015/10/31 01:12 21/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
JTextField.CENTERJTextField.RIGHTJTextField.LEADING (vezetés, vagyis balra)JTextField.TRAILING (követeés, vagyis jobbra)
Listadoboz
Egyszerű listadoboz
Listadobozhoz két osztály szükséges:
DefaultListModelJList
Az első egy könnyen kezelhető listáról gondoskodik a másik pedig a megjelenítésről.
Program01.java
import javax.swing.JFrame;import javax.swing.JList;import javax.swing.DefaultListModel;import javax.swing.JScrollPane;import java.awt.FlowLayout;import java.awt.Dimension; class Program01 extends JFrame{ final static long serialVersionUID = 1; DefaultListModel<String> listModel = newDefaultListModel<String>(); JList<String> jlist1 = new JList<String>(listModel); JScrollPane scrollPane1 = new JScrollPane(jlist1); Program01() { scrollPane1.setPreferredSize(new Dimension(100, 200)); listModel.addElement("Első"); listModel.addElement("Második"); listModel.addElement("Harmadik"); listModel.addElement("Negyedik"); add(scrollPane1); setLayout(new FlowLayout()); pack(); setVisible(true); } public static void main(String args[]) { new Program01();
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
}}
Ha kihagyjuk a ScrollPane osztályt, akkor listánk összeugrik.
Elem törlése:
model.remove(2);
A példában a harmadik elemet töröljük.
Elemek törlése:
model.clear();
Adott elem cseréje:
model.set(1, "gggg");
A második elem cseréje „gggg” karaktersorozatra.
A kiválasztott:
jlist1.getSelectedIndex()
Az 50-dik elemet szeretném:
String str = listModel.getElementAt(50);
Egy elem átírása:
void setElementAt(Object obj, int index)
Van kijelölt?:
isSelectionEmpty()
A különbség csupán a <String> részek a két sorban:
DefaultListModel<String> listModel = new DefaultListModel<String>();JList<String> jlist1 = new JList<String>(listModel);
Listadoboz másként
String[] lista = {"első", "második", "harmadik"};JList listabox = new Jlist(lista);
2015/10/31 01:12 23/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
Teljes példa:
Program.java
import javax.swing.*; class Program extends JFrame{ JList listabox; Program() { setLayout(null); String[] lista = {"első", "második", "harmadik"}; listabox = new JList(lista); listabox.setBounds(100,100, 100,100); add(listabox); setSize(800,600); setVisible(true); } public static void main(String args[]) { new Program(); }}
Skrollozható kerettel:
Program.java
import javax.swing.*; class Program extends JFrame{ JList listabox; Program() { setLayout(null); String[] lista = {"első", "második", "harmadik", "negyedik","ötödik", "hatodik", "hetedik", "nyolcadik"}; listabox = new JList(lista); JScrollPane listaPane = new JScrollPane(listabox); listaPane.setBounds(100, 100, 100, 100); add(listaPane); setSize(800,600); setVisible(true); } public static void main(String args[]) {
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
new Program(); }}
Listamodel használata
Program.java
import javax.swing.*; class Program extends JFrame{ JList listabox; DefaultListModel listaModel; Program() { setLayout(null); listaModel = new DefaultListModel(); listaModel.addElement("Első"); listaModel.addElement("Második"); listaModel.addElement("Harmadik"); listaModel.addElement("Negyedik"); listaModel.addElement("Ötödik"); listaModel.addElement("Hatodik"); listaModel.addElement("Hetedik"); listaModel.addElement("Nyolcadik"); listabox = new JList(listaModel); JScrollPane listaPane = new JScrollPane(listabox); listaPane.setBounds(100, 100, 100, 100); add(listaPane); setSize(800,600); setVisible(true); } public static void main(String args[]) { new Program(); }}
Listamodel kezelése
Program.java
import javax.swing.*;
2015/10/31 01:12 25/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
import java.awt.event.*; class Program extends JFrame{ JList listabox; DefaultListModel listaModel; JButton gomb; Program() { setLayout(null); listaModel = new DefaultListModel(); listaModel.addElement("Első"); listaModel.addElement("Második"); listabox = new JList(listaModel); JScrollPane listaPane = new JScrollPane(listabox); listaPane.setBounds(100, 100, 100, 100); gomb = new JButton("Hozzáad"); gomb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { listaModel.addElement("Harmadik"); } }); gomb.setBounds(20, 20, 100, 30); add(listaPane); add(gomb); setSize(800,600); setVisible(true); } public static void main(String args[]) { new Program(); }}
A DefaultListModel osztály metódusai
void add(int index, Object element) Egy elem beszúrása egy adott helyre.void addElement(Object obj) A lista végéhez fűzünk egy elemet.int capacity() A lista kapacitása.void clear() A lista összes elemének törlése.boolean contains(Object elem) Az adott elem a listában van-e?void copyInto(Object[] anArray) Komponensek másolása a megadott tömbbe.
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
Object elementAt(int index) Az elem indexével tér vissza.
Enumeration<?> elements() A lista komponenseinek felsorolt típusával(Enumeration) tér vissza.
void ensureCapacity(int minCapacity)Növeljük a lista kapacitását, ha szükséges,hogytárolni tudjuk a megadott minimálist elemet.
Object firstElement() A lista első elemét kapjuk vissza.
Object get(int index) A lista adott pozícióban lévő elemét adjavissza.
Object getElementAt(int index) Visszatér az adott indexű elemmel.int getSize() Visszaadja a komponensek számát a listában.int indexOf(Object elem) Egy elem első előfordulását keresi.
int indexOf(Object elem, int index) Egy elem első előfordulását keresi, az adottindextől.
void insertElementAt(Object obj, intindex) Egy elem beszúrása a megadott indexhez.
boolean isEmpty() Megvizsgáljuk, hogy van-e elem a listának.Object lastElement() A lista utolsó elemét adja vissza.
int lastIndexOf(Object elem) Az elem utolsó előfordulásának indexét adjavissza.
int lastIndexOf(Object elem, int index) Az elem utolsó előfordulásának indexét adjavissza, az adott indextől keresve.
Object remove(int index) Adott elem törlése a listából, a megadottpozícióban.
void removeAllElements() Az összes elem törlése, a méret lenullázása.
boolean removeElement(Object obj) Törli az elemet az első előfordulásnál(legkisebb indexűt) a listából.
void removeElementAt(int index) Elem törlése a megadott indexnél.
void removeRange(int fromIndex, inttoIndex) Elemek törlése a megadott indextartományból.
Object set(int index, Object element) Adott pozícióban kicseréli egy elemet amegadott elemre.
void setElementAt(Object obj, int index) Adott indexű elemet beállítja a megadottelemre.
void setSize(int newSize) A lista méretének beállítása.int size() Visszaadja az elemek számát a listában.
Object[] toArray() Visszatér egy tömbbel, amely tartalmazza azösszes elemet, sorba rendezve.
String toString() Az objektum beállításainak megjelenítése,karaktersorozatként.
void trimToSize() A lista kapacitását beállítja a lista méretéhez.
Iterálás:
for(Object s : dictListModel.toArray()) writer.println((String)s);
Függőleges görgetés beállítása:
2015/10/31 01:12 27/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
wordScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
Ez az elem legyen látható. ScrollPane esetén is működik:
wordList.ensureIndexIsVisible(index);
Kiválasztás figyelése. Egy esemény bekövetkezik az egér lenyomásakor és a felengedéskor is. AgetValueIsAdjusting() metódussal kiválasztható az első, vagy a második esemény:
topicsList.addListSelectionListener(new ListSelectionListener(){ public void valueChanged(ListSelectionEvent e) { if(e.getValueIsAdjusting()) { //Amit az egérlenyomásakor csinálunk } else { //Amit az egér felengedésekor csinálunk } }});
Párbeszédpanel
A JOptionPane osztály használatához importálni kell azt a javax.swing csomagból:
import javax.swing.JOptionPane;
Gyors kezdéshez:
javax.swing.JOptionPane.showMessageDialog(getContentPane(), "");
Üzenetablakok
Egy egyszerű párbeszédablak:
JOptionPane.showMessageDialog(null, edit.getText());
Az első paraméter vagy null vagy a szülőablak. Ha null értéket írtunk be, a felugró párbeszédablak aprogramablaktól függetlenül a képernyő közepén jelenik meg.
JOptionPane.showMessageDialog(ablak, edit.getText());
Ha megadjuk a szülőablakot, akkor a párbeszédpanel a programablakhoz igazodik.
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
A párbeszédpanel 5 féle lehet. Az alapértelmezett az „information”
kérdőinformációsfigyelmeztetőhibacsak szöveg
JOptionPane.showMessageDialog(szulo ,"Üzenet","Névjegy",JOptionPane.INFORMATION_MESSAGE );
Lehet egy ötödik paraméter is az ikon, ekkor információs párbeszédablaknak hozzuk létre.
JOptionPane.showMessageDialog(szulo ,"Üzenet","Névjegy",JOptionPane.INFORMATION_MESSAGE,ikon );
Információt kérő párbeszédablakok
int res = JOptionPane.showConfirmDialog(null,"Figyelem! Biztosan ezt akarod?","Figyelmeztetés",JOptionPane.YES_NO_OPTION); if (res == JOptionPane.YES_OPTION) System.out.println("Igen");else System.out.println("Nem");
Nyomógomb saját szöveggel
Object[] options = {"Igen, kérem", "Nem, köszönöm. "}; int n = JOptionPane.showOptionDialog(ablak, "Kéred ezt a lehetőséget?", "Általános kérdés", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, //nem használunk külön ikont options, //A gombok feliratai options[]); //Az alapértelmezett gomb felirata
2015/10/31 01:12 29/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
Forrás
http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.htmlhttp://docs.oracle.com/javase/6/docs/api/javax/swing/JOptionPane.html
Párbeszédablak átadott értékkel
Saját párbeszédablak készítése, átadott értékkel.
Program02.java
import javax.swing.JFrame;import javax.swing.JDialog;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JTextField;import java.awt.FlowLayout;import java.awt.event.ActionListener;import java.awt.event.ActionEvent; class Program02 extends JFrame{ JButton gomb = new JButton("Bekér"); JTextField mezo = new JTextField(10); Program02() { gomb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Parbeszed p = new Parbeszed(); mezo.setText(p.showDialog()); } }); setLayout(new FlowLayout()); add(gomb); add(mezo); pack(); setVisible(true); } public static void main(String args[]) { new Program02(); }} class Parbeszed extends JDialog{
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
String nev; JTextField mezo = new JTextField(5); Parbeszed() { JButton gomb = new JButton("Ok"); gomb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { nev = mezo.getText(); setVisible(false); } }); add(new JLabel("Név: ")); add(mezo); add(gomb); setLayout(new FlowLayout()); pack(); } public String showDialog() { setModal(true); setVisible(true); return nev; }}
Ikon
import javax.swing.*; class ap{ 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); ablak.setSize(400,300); ablak.setVisible(true); }}
Készíthetünk külön ikon változót, amit esetleg másra is használhatunk.
2015/10/31 01:12 31/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
ImageIcon ikon = new ImageIcon("ikon.png"); ablak.setIconImage(ikon.getImage());
Esetleg így:
Program.java
import javax.swing.*;import java.awt.*;class Program extends JFrame{ Program() { setIconImage(new ImageIcon("kep.png").getImage()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 200); setVisible(true); } public static void main(String args[]) { new Program(); }}
A megvalósításhoz egy rögtönzött ikon:
http://szit.hu/download/oktatas/java/kep.png
Program01.java
import javax.swing.JFrame;import javax.swing.JButton;import javax.swing.ImageIcon;//~ import java.awt.Image;class Program01 extends JFrame{ JButton gomb = new JButton("Klikkelj ide"); Program01() { setIconImage(new ImageIcon("ikon.png").getImage()); //~ Image kep = newImageIcon("ikon.png").getImage().getScaledInstance(24, 24,java.awt.Image.SCALE_SMOOTH); gomb.setIcon(new ImageIcon("ikon.png")); add(gomb); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true);
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
} public static void main(String[] args) { new Program01(); }}
A program ikon csak kis méretben jelenik meg. A nyomógombhoz rendelt ikon viszont az eredetiméreteben. A megjegyzésbe tett részt ha használjuk átméretezhetjük az eredeti képméretet.
Keret stílus
//a keretdekoráció look and feel stílusúJFrame.setDefaultLookAndFeelDecorated(true); //a keret elkészítéseJFrame frame = new JFrame("A window"); //keretikon beállítása fájlbólframe.setIconImage(new ImageIcon(imgURL).getImage());
Komponens szegély
A szegélyekről
Minden JComponentnek lehet egy vagy több szegélye. A border, azaz a szegély megmondja, hogynézzen ki egy Swing komponens széle, és körbefogja azt.
A JComponent-ek számára szegélyt a setBorder() metódussal határozhatunk meg. A BorderFactoryosztály használhatjuk a szegély jellegének megadásánál.
A következőben egy szimpla panel egyszerű szegélyét adjuk meg.
JPanel pane = new JPanel();pane.setBorder(BorderFactory.createLineBorder(Color.black));
Egyszerű szegély
Egy konkrét megvalósítás
Program01.java
import javax.swing.*;import java.awt.*;
2015/10/31 01:12 33/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
import javax.swing.border.*; class Program01 { public static void main(String args[]) { JFrame ablak = new JFrame("Szegély példa"); JLabel cimke = new JLabel("Felirat"); Border a = BorderFactory.createLineBorder(Color.black); ablak.setLayout(null); cimke.setBorder(a); cimke.setBounds(10, 10, 80, 20); ablak.add(cimke); ablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ablak.setSize(400,300); ablak.setVisible(true); }}
Szegély cím beállítása
import javax.swing.*;import java.awt.*;import javax.swing.border.*; class ap{ public static void main(String args[]) { JFrame ablak = new JFrame("Szegély példa"); JLabel cimke = new JLabel("Felirat"); Border a = BorderFactory.createLineBorder(Color.black); a = BorderFactory.createTitledBorder( a, "cím", TitledBorder.LEFT, //CENTER TitledBorder.TOP); //BELOW_BOTTOM, ABOVE_TOP, TOP ablak.setLayout(null); cimke.setBorder(a); cimke.setBounds(10, 10, 120, 80); ablak.add(cimke); ablak.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ablak.setSize(400,300); ablak.setVisible(true);
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
}}
Létrehozható szegélyfajták
javax.swing.border.LineBorderjavax.swing.border.EtchedBorderjavax.swing.border.BevelBorderjavax.swing.border.EmptyBorderjavax.swing.border.MatteBorderjavax.swing.border.TitledBorderjavax.swing.border.CompoundBorderjavax.swing.BorderFactory
Példák:
jlist1.setBorder(new EtchedBorder() );
scrollpane1.setBorder(new TitledBorder("Tartalom címe"));
Méretezett üres szegélyen belül, szegély és felirat kombinációja:
panel1.setBorder( BorderFactory.createCompoundBorder( new EmptyBorder(10, 10, 10, 10), new TitledBorder("Behelyettesítés") ));
Üres méretezett szegély és felirat:
panel1.setBorder(new TitledBorder(BorderFactory.createEmptyBorder(10, 10,10, 10), "Gyakoriságelemzés"));
Üres szegély méretmegadással:
panel1.setBorder(BorderFactory.createEmptyBorder(,10,10,10));
Utóbbit lehet így is:
panel1.setBorder(new EmptyBorder(10, 10, 10, 10) );
BevelBorder
Border bevelBorder = BorderFactory.createBevelBorder(BevelBorder.RAISED);
Több info: http://docs.oracle.com/javase/tutorial/uiswing/components/border.html
2015/10/31 01:12 35/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
Rádiógombok
radiogomb.java
import javax.swing.JButton;import javax.swing.JFrame;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import javax.swing.ButtonGroup;import javax.swing.JRadioButton; class radiogomb extends JFrame{ JButton GombElso; ButtonGroup csoport; JRadioButton radiogomb1; JRadioButton radiogomb2; JRadioButton radiogomb3; JRadioButton radiogomb4; radiogomb() { this.setSize(800, 600); GombElso = new JButton(); radiogomb1 = new JRadioButton(); radiogomb2 = new JRadioButton(); radiogomb3 = new JRadioButton(); radiogomb4 = new JRadioButton(); csoport = new ButtonGroup(); this.setVisible(true); this.setLayout(null); GombElso.setText("Valami"); radiogomb1.setText("Valami"); radiogomb2.setText("Valami2"); radiogomb3.setText("Valami3"); radiogomb4.setText("Valami4"); radiogomb1.setSelected(false); radiogomb2.setSelected(true); radiogomb3.setSelected(false); radiogomb4.setSelected(false); GombElso.setBounds(10,10, 100, 30); radiogomb1.setBounds(120,10,100,20); radiogomb2.setBounds(120,30,100,20); radiogomb3.setBounds(120,50,100,20); radiogomb4.setBounds(120,70,100,20); csoport.add(radiogomb1);
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
csoport.add(radiogomb2); csoport.add(radiogomb3); csoport.add(radiogomb4); this.add(GombElso); this.add(radiogomb1); this.add(radiogomb2); this.add(radiogomb3); this.add(radiogomb4); GombElso.addActionListener(new ButtonListener1()); } public static void main(String args[]) { new radiogomb(); } class ButtonListener1 implements ActionListener { public void actionPerformed(ActionEvent e) { if(radiogomb1.isSelected()) GombElso.setText("Első"); if(radiogomb2.isSelected()) GombElso.setText("Második"); if(radiogomb3.isSelected()) GombElso.setText("Harmadik"); if(radiogomb3.isSelected()) GombElso.setText("Negyedik"); } }}
ButtonGroup
http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/ButtonGroup.html
Táblázat
Bevezetés a táblázatkészítésbe
Egy táblázat adatainak megjelenítéséhez a JTable osztály használhatjuk. A táblázatot egy JScrollPanenevű konténerosztályra szoktuk feltenni. Ha szeretnénk a sorok és oszlopok számát futási időbenváltoztatnunk, akkor 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.
Egyszerű tábla
Program.java
import javax.swing.*;
2015/10/31 01:12 37/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
class Program extends JFrame{ JTable tabla; Program() { String[] mezoNevek = {"id", "Név", "Település", "Kor"}; Object[][] adat = { {1, "Nagy Peter", "Szolnok", 67}, {2, "Nagy Lajos", "Szolnok", 27} }; tabla = new JTable(adat, mezoNevek); tabla.setBounds(100, 100, 300, 200); setLayout(null); add(tabla); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); setVisible(true); } public static void main(String[] argv) { new Program(); }}
Tábla fejléccel
A táblát egy konténerhez adjuk. Esetünkben a JScrollPane osztály egy objektumához.
Program.java
import javax.swing.*; class Program extends JFrame{ JTable tabla; JScrollPane spanel; Program() { String[] mezoNevek = {"id", "Nev", "Telepules", "Kor"}; Object[][] adat = { {1, "Nagy Peter", "Szolnok", 67}, {2, "Nagy Lajos", "Szolnok", 27} };
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
tabla = new JTable(adat, mezoNevek); spanel = new JScrollPane(tabla); spanel.setBounds(50, 50, 400, 300); add(spanel); setLayout(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); setVisible(true); } public static void main(String[] argv) { new Program(); }}
Oszlop, sor méretezés
Oszlop szélessége:
tabla.getColumnModel().getColumn().setPreferredWidth(10);tabla.getColumnModel().getColumn(1).setPreferredWidth(200);
A példában az első és második sor szélességét állítjuk be. Az oszlop szélessége a megadott számhozegy közelítő érték lesz.
Sorok magassága:
tabla.setRowHeight(1, 80);
A példában a második sor magasságát állítjuk be.
Szelekció
Háttérszín:
tabla.setSelectionBackground(Color.red);
Kijelöltek indexének kinyerése:
int sor = tabla.getSelectedRow();int osz = tabla.getSelectedColumn();
Szelekciós mód:
2015/10/31 01:12 39/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
// ListSelectionModel.SINGLE_INTERVAL_SELECTION// ListSelectionModel.SINGLE_SELECTION// ListSelectionModel.MULTIPLE_INTERVAL_SELECTIONtabla.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tabla.setColumnSelectionAllowed(true);
tabla.setRowSelectionAllowed(false);
tabla.setCellSelectionEnabled(true);
Igazítás
DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();// JLabel.RIGHT, JLabel.CENTER, JLabel.LEFT (alapértelmezés)// DefaultTableCellRenderer.RIGHT, .CENTER, .RIGHTrightRenderer.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);tabla.getColumnModel().getColumn().setCellRenderer(rightRenderer);
Táblázat változásának figyelése
import javax.swing.event.*;... tabla.getModel().addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent ev) { System.out.println("változott egy cella"); }});
Fejléc csere
A táblázat fejlécét a modellben tároljuk és ott változtatjuk. A feladatra két metódus áll rendelkezésre.
Lehet így:
void setColumnIdentifiers(Object[] newIdentifiers)
Lehet így:
void setColumnIdentifiers(Vector columnIdentifiers)
Konkrét megvalósítás:
Object[] obj ={"Az", "Név", "Anyja neve", "Település", "Lakcím", "Fizetés", "Születés", "Jutalom", "Beosztás Az"};
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
tableModel.setColumnIdentifiers(obj);
Tartalom cseréje
//Tábla tartalmának beállítása Első sor, második mezőtabla.getModel().setValueAt("Feher Bela", , 1);
A tabla.getModel() metódus egy TableModel típusú objektumot ad vissza.
void addTableModelListener(TableModelListener l) Egy eseményfigyelő hozzáadásaint getColumnCount() A mezők számát adja vissza
String getColumnName(int mezoIndex) Adott indexű mező nevét adja visszaint getRowCount() A sorok számát adja vissza
Object getValueAt(int sorIndex, int mezoIndex) Egy cell értékét adjaboolean isCellEditable(int sorIndex, int mezoIndex) Szerkeszthető-e?
void removeTableModelListener(TableModelListener l) Az változások figyelésénekkikapcsolása
void setValueAt(Object ertek, int sorIndex, int mezoIndex) Egy cella értékének beállítása
Oszlopok, sorok beszúrása
A feladathoz használnunk kell a DefaultTableModel osztályt. Ezzel létrehozzuk egy model objektumot,amelyet a JTable konstruktorban átadunk.
Program.java
import javax.swing.*;import javax.swing.table.*;class Program extends JFrame{ JTable tabla; JScrollPane spanel; Program() { String[] mezoNevek = {"id", "Nev", "Telepules", "Kor"}; Object[][] adat = { {1, "Nagy Peter", "Szolnok", 67}, {2, "Nagy Lajos", "Szolnok", 27} }; DefaultTableModel model = new DefaultTableModel(adat,mezoNevek); tabla = new JTable(model); spanel = new JScrollPane(tabla); spanel.setBounds(50, 50, 400, 300);
2015/10/31 01:12 41/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
//Mező hozzáadása model.addColumn("Fizetes"); //Beszúrás az utolsó helyre model.insertRow(tabla.getRowCount(),new Object[]{"","","","",""}); //Hozzáfűzés az utolsó helyre model.addRow(new Object[]{3, "Akad Tibor", "Miskolc", 37}); add(spanel); setLayout(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); setVisible(true); } public static void main(String[] argv) { new Program(); }}
További metódusok használhatók a DefaultTableModel osztályból.
Cella színezése
Program01.java
import javax.swing.JFrame;import javax.swing.JTable;import javax.swing.JLabel;import java.awt.Component;import java.awt.Color;import javax.swing.table.TableCellRenderer; class Program01 extends JFrame{ private JTable tabla; public Program01() { setLayout(null); tabla = new JTable(9, 9); tabla.setBounds(100, 100, 300, 200); int columnWidht = 20; int rowHeight = 25;
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
for(int i=; i<9; i++)tabla.getColumnModel().getColumn(i).setPreferredWidth(columnWidht); for(int i=; i<9; i++) tabla.setRowHeight(i, rowHeight); tabla.setDefaultRenderer(Object.class, newMyTableCellRenderer()); tabla.getModel().setValueAt(Color.red, 3, 3); tabla.getModel().setValueAt(Color.red, 3, 5); add(tabla); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); setVisible(true); } public static void main(String args[]) { new Program01(); } class MyTableCellRenderer extends JLabel implementsTableCellRenderer { MyTableCellRenderer() { setOpaque(true); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, introw, int col) { setBackground((Color) value); return this; } }}
Néhány metódus:
setShowGrid(boolean bol)
setGridColor(Color col):
setShowVerticalLines():
Rajzolás a táblázaton
Ha rajzolni szeretnék egy táblázatra, akkor helyfoglalást (példányosítás) a következő módon adjukmeg.
2015/10/31 01:12 43/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
JTable tabla = new JTable(9, 9){ protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor (Color.black); g.drawString("1", 2, 12); }};
Táblázat fontméret
tabla.setFont(new Font("Serif", Font.BOLD, 12));
Táblázat színezés
Egész tábla háttérszíne:
tabla.setBackground(Color.blue);
Szöveg színe:
tabla.setForeground(Color.yellow);
Rács színe:
tabla.setGridColor(Color.black);
Szegély színe:
tabla.setBorder(new MatteBorder(1, 1, 1, 1, Color.RED));
Az egész táblázat fontja
tabla.setFont(new Font("Serif", Font.BOLD, 16));
A táblázatra rajzoláskor is ezt használjuk, hacsak nem adunk meg rajzolásnál mást.
TableModel használata
TableModel tableModel = new AbstractTableModel(){ @Override public Object getValueAt(int row, int col) { return new Integer(row*col); };
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
@Override public int getColumnCount(){return 10;}; @Override public int getRowCount(){return 10;}; }; JTable table = new JTable(tableModel); JScrollPane jsp = new JScrollPane(table);
Irodalom a táblázathoz
Linkek:
http://www.java2s.com/Tutorial/Java/0240__Swing/CreatingaJTable.htmhttp://www.exampledepot.com/egs/javax.swing.table/pkg.htmlhttp://www.java2s.com/Code/Java/Swing-Components/SortableTableExample.htmhttp://www.javaworld.com/javaworld/javatips/jw-javatip77.htmlhttp://quicktable.org/jtable/quicktablefinal.htm#9http://docs.oracle.com/javase/tutorial/uiswing/components/table.htmlhttp://docs.oracle.com/javase/6/docs/api/javax/swing/JTable.html
Ablakméret lekérdezése
import java.awt.Dimension;import javax.swing.*;import java.awt.event.ActionListener;import java.awt.event.ActionEvent; class prog extends JFrame{ JButton gomb; JLabel cimke; prog() { setLayout(null); gomb = new JButton("Méret"); cimke = new JLabel("Adatok"); gomb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Dimension ablakMeret = getSize(); int ablakMagassag = ablakMeret.height; int ablakSzelesseg = ablakMeret.width; cimke.setText(Integer.toString(ablakMagassag) + "x" +Integer.toString(ablakSzelesseg)); } }); gomb.setBounds(20, 20, 100, 30); cimke.setBounds(100,100, 100,30); add(gomb);
2015/10/31 01:12 45/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
add(cimke); setSize(800,600); setVisible(true); } public static void main(String args[]) { new prog(); }}
Java GUI Füles panel
Füles ablakok elkészítésére a TabbedPane osztályt használjuk. Az alábbiakban ennek használatáralátunk egy példát.
Fülespanel 001
import javax.swing.*;import java.awt.BorderLayout; class fulespanel extends JFrame{ private JTabbedPane fulespanelek; private JPanel panel1; private JPanel panel2; private JPanel panel3; fulespanel() { setTitle("Fülespanelek"); setSize(800,600); setLayout( new BorderLayout() ); panel1Keszites(); panel2Keszites(); panel3Keszites(); fulespanelek = new JTabbedPane(); fulespanelek.addTab("Első", panel1); fulespanelek.addTab("Második", panel2); fulespanelek.addTab("Harmadik", panel3); add(fulespanelek); } void panel1Keszites() {
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
panel1 = new JPanel(); panel1.setLayout( null ); JLabel cimke1 = new JLabel( "Első panel felirata" ); cimke1.setBounds( 10, 15, 150, 20 ); panel1.add( cimke1 ); } void panel2Keszites() { panel2 = new JPanel(); panel2.setLayout( null ); JLabel cimke1 = new JLabel( "Második panel felirata" ); cimke1.setBounds( 10, 15, 150, 20 ); panel2.add( cimke1 ); } void panel3Keszites() { panel3 = new JPanel(); panel3.setLayout( null ); JLabel cimke1 = new JLabel( "Harmadik panel felirata" ); cimke1.setBounds( 10, 15, 150, 20 ); panel3.add( cimke1 ); } public static void main(String args[]) { fulespanel ablak = new fulespanel(); ablak.setVisible(true); }}
Java füles panel külső linkek
http://www.cs.cf.ac.uk/Dave/HCI/HCI_Handout_CALLER/node61.htmlhttp://ngweb.atw.hu/applets/tabbedpaneapplet.htmlhttp://www.codeproject.com/KB/tabs/JTabbedPane.aspx
Panel használata
Program.java
import javax.swing.*;import java.awt.*;class Program extends JFrame{ JPanel panel1; Program() { panel1 = new JPanel();
2015/10/31 01:12 47/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
panel1.setSize(200, 200); panel1.setLocation(50, 50); panel1.setBackground(Color.blue); this.setLayout(null); this.getContentPane().add(panel1); this.setSize(800, 600); this.setLocationRelativeTo(null); this.setVisible(true); } public static void main(String args[]) { new Program(); }}
Menü
Egyszerű menü
Program, egyetlen menü, egyetlen menüpontjával.
Program.java
import javax.swing.*;import java.awt.event.*; class Program extends JFrame implements ActionListener{ JMenuBar menusav; JMenu filemenu; JMenuItem kilepesitem; Program() { menusav = new JMenuBar(); filemenu = new JMenu("Fájl"); kilepesitem = new JMenuItem("Kilépés"); kilepesitem.addActionListener(this); setJMenuBar(menusav); menusav.add(filemenu); filemenu.add(kilepesitem); setSize(800, 600); setVisible(true);
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
} public static void main(String args[]) { new Program(); } public void actionPerformed(ActionEvent e) { if(e.getSource() == kilepesitem) System.exit(); }}
Szeparátor hozzáadása
Program.java
import javax.swing.*;import java.awt.event.*; class Program extends JFrame implements ActionListener{ JMenuBar menusav; JMenu filemenu; JMenuItem kilepesitem; JMenuItem ujitem; Program() { menusav = new JMenuBar(); filemenu = new JMenu("Fájl"); kilepesitem = new JMenuItem("Kilépés"); ujitem = new JMenuItem("Új"); kilepesitem.addActionListener(this); setJMenuBar(menusav); menusav.add(filemenu); filemenu.add(ujitem); filemenu.addSeparator(); filemenu.add(kilepesitem); setSize(800, 600); setVisible(true); } public static void main(String args[]) { new Program();
2015/10/31 01:12 49/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
} public void actionPerformed(ActionEvent e) { if(e.getSource() == kilepesitem) System.exit(); }}
Rádiógomb és jelölőnégyzet
Program.java
import javax.swing.*;import java.awt.event.*; class Program extends JFrame implements ActionListener, ItemListener{ JMenuBar menusav; JMenu filemenu; JMenuItem kilepesitem; JMenuItem ujitem; JRadioButtonMenuItem kodolasitem; JRadioButtonMenuItem kodolasitem2; JCheckBoxMenuItem mentesitem; Program() { menusav = new JMenuBar(); filemenu = new JMenu("Fájl"); kilepesitem = new JMenuItem("Kilépés"); ujitem = new JMenuItem("Új"); kodolasitem = new JRadioButtonMenuItem("Kódolás"); kodolasitem2 = new JRadioButtonMenuItem("Kódolás2"); mentesitem = new JCheckBoxMenuItem("Automatikus mentés"); kilepesitem.addActionListener(this); kilepesitem.setMnemonic(KeyEvent.VK_C); setJMenuBar(menusav); menusav.add(filemenu); filemenu.add(ujitem); filemenu.addSeparator(); filemenu.add(kodolasitem); filemenu.add(kodolasitem2); filemenu.add(mentesitem); filemenu.addSeparator(); filemenu.add(kilepesitem);
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
setSize(800, 600); setVisible(true); } public static void main(String args[]) { new Program(); } public void actionPerformed(ActionEvent e) { if(e.getSource() == kilepesitem) System.exit(); } public void itemStateChanged(ItemEvent e) { }}
ComboBox
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();
2015/10/31 01:12 51/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
}}
A ComboBox alapértelmezett magassága 24 pont.
combo.removeAllItem();
Ha kiválasztott változott:
import java.awt.event.ItemEvent;import java.awt.event.ItemListener; ... comboBox.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e) { }});
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:
groupComboBox.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent e) { if(e.getStateChange()==2) ; //Csinálunk valamit }});
int a = lld.getItemCount();int b = lld.getSelectedIndex();
Adott elem lekérése:
if(lld.getItemCount()>) String str = (String) lld.getSelectedItem();
A getSelectedItem() metódus Object típust ad vissza.
Rádiógomb
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
Egyszerű rádiógomb
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(); }}
A rádiógombokat, hozzá kell adni a ButtonGroup objektumhoz is, de ez csak csoportosításra szolgál! Amegjelenés érdekében a JPanel objektumhoz is hozzá kell adni. Persze a csoportosításnak csak akkorvan értelme, ha több csoportunk is van.
Csoportok
Program.java
import javax.swing.*;import java.awt.*;
2015/10/31 01:12 53/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
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=; 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();
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
}}
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:
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=; 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));
2015/10/31 01:12 55/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
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(); }}
Szöveghely
Program.java
import javax.swing.*; class Program extends JFrame{ JTextArea hely; Program() { hely = new JTextArea(); add(hely); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); setVisible(true); } public static void main(String args[]) { new Program(); }}
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
Színezés
Egy címkét színezünk a példaprogramban:
Program.java
import javax.swing.*;import java.awt.*; class Program extends JFrame{ JLabel cimke; Program() { cimke = new JLabel("Valamiaaaaaaaaaaa"); cimke.setForeground(Color.blue); add(cimke); pack(); setVisible(true); } public static void main(String args[]) { new Program(); }}
A címke hátterének színezése:
Program.java
import javax.swing.*;import java.awt.*; class Program extends JFrame{ JLabel cimke; JLabel cimke2; JPanel panel; Program() { cimke = new JLabel("Valamiaaaaaaaaaaa"); cimke2 = new JLabel("rövid", JLabel.CENTER); panel = new JPanel(); cimke2.setForeground(Color.blue); cimke2.setFont(new Font("Arial", Font.BOLD, 20)); panel.add(cimke2);
2015/10/31 01:12 57/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
panel.setBackground(Color.white); setLayout(new GridLayout(,1)); add(cimke); add(panel); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); } public static void main(String args[]) { new Program(); }}
Tulajdonképpen egy panelra tesszük, és azt színezzük.
Fontok
Program.java
import javax.swing.*;import java.awt.*; class Program extends JFrame{ JLabel cimke; Program() { cimke = new JLabel("Valamiaaaaaaaaaaa"); cimke.setForeground(Color.blue); cimke.setFont(new Font("Arial", Font.BOLD, 20)); add(cimke); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); } public static void main(String args[]) { new Program(); }}
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
Igazítás
Program.java
import javax.swing.*;import java.awt.*; class Program extends JFrame{ JLabel cimke; JLabel cimke2; Program() { cimke = new JLabel("Valamiaaaaaaaaaaa"); cimke2 = new JLabel("rövid", JLabel.CENTER); cimke.setForeground(Color.blue); cimke.setFont(new Font("Arial", Font.BOLD, 20)); setLayout(new GridLayout(,1)); add(cimke); add(cimke2); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); } public static void main(String args[]) { new Program(); }}
Másik ablak
Az alábbiakban egy másik ablakot indítunk, majd arra is felteszünk egy gombot, ami annyit csinál,hogy bezárja azt.
Program.java
import javax.swing.*;import java.awt.event.*; class Mas extends JFrame{ JButton gomb; Mas() {
2015/10/31 01:12 59/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
gomb = new JButton("Nyomj"); gomb.addActionListener(new GombKezelo()); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); add(gomb); setSize(300, 200); } class GombKezelo implements ActionListener { public void actionPerformed(ActionEvent e) { dispose(); } }} class Program extends JFrame{ JButton gomb; Program() { gomb = new JButton("Nyomj"); gomb.addActionListener(new GombKezelo()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); add(gomb); setSize(200, 100); setVisible(true); } class GombKezelo implements ActionListener { public void actionPerformed(ActionEvent e) { Mas m = new Mas(); m.setVisible(true); } } public static void main(String args[]) { new Program(); }}
Vegyük észre! A következő metódussal megadjuk, hogy az ablak bezárás eseményre töröljük az újablakot:
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
A dispose() metódussal pedig kiváltom a bezáráseseményt:
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
dispose();
Ha másik ablak párbeszédablak
Program.java
import javax.swing.*;import java.awt.event.*;class Program extends JFrame{ JButton masikgomb; Program() { masikgomb = new JButton("Masik"); masikgomb.addActionListener(new MasikGombClick()); masikgomb.setBounds( 50, 50, 100, 25); add(masikgomb); setLayout(null); setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); } public static void main(String[] argv) { new Program(); } class MasikGombClick implements ActionListener { public void actionPerformed(ActionEvent e) { Parbeszed parbeszed = new Parbeszed(); parbeszed.show(); } } class Parbeszed extends JDialog { Parbeszed() { setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); setSize(400, 300); setLocationRelativeTo(this); setVisible(true); } }}
2015/10/31 01:12 61/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
DO_NOTHING_ON_CLOSE Nem teszünk semmitHIDE_ON_CLOSE Az ablak elrejtéseDISPOSE_ON_CLOSE Az ablak elrejtése és törlése
Fájlválasztó párbeszédablak
Egyszerűen parancssorból:
Program.java
import javax.swing.JFileChooser;class Program02{ Program02() { JFileChooser fc = new JFileChooser(); fc.showOpenDialog(null); String utvonal = fc.getSelectedFile().getPath(); System.out.println(utvonal); } public static void main(String[] args) { new Program02(); }}
Filter alkalmazása:
Program.java
import javax.swing.*;import java.awt.event.*;import javax.swing.filechooser.*;import java.awt.image.*;import java.io.File; class ImageFilter extends FileFilter{ private final String[] okFileExtensions = new String[] {"jpg", "png", "gif"}; public boolean accept(File file) { for (String extension : okFileExtensions) { if (file.getName().toLowerCase().endsWith(extension))
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
{ return true; } } return false; } public String getDescription() { return "Képek"; }} class Program extends JFrame{ JFileChooser fc = new JFileChooser(); JButton gomb; Program() { //~ fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); fc.setAcceptAllFileFilterUsed(false); fc.addChoosableFileFilter(new ImageFilter()); gomb = new JButton("Nyomj"); gomb.addActionListener(new GombClick()); add(gomb); setSize(400, 300); setVisible(true); } class GombClick implements ActionListener { public void actionPerformed(ActionEvent e) { int a = fc.showOpenDialog(Program.this); setTitle(fc.getSelectedFile().getPath()); } } public static void main(String args[]) { new Program(); }}
Kép beillesztése
2015/10/31 01:12 63/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
Kép nyomógombon
import javax.swing.*;import java.awt.*;class Program extends JFrame{ JButton gomb; Program() { ImageIcon kep = new ImageIcon("kep.png"); gomb = new JButton(kep); gomb.setBounds(10, 10, 100, 30); add(gomb); setLayout(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 200); setVisible(true); } public static void main(String args[]) { new Program(); }}
Kép panelen
Program.java
import javax.swing.*;import java.awt.*; class KepPanel extends JPanel{ Image image = null; KepPanel() { image = new ImageIcon("kep.png").getImage(); } public void paintComponent(Graphics g) { g.drawImage(image, , , 200, 200, null); } } class Program extends JFrame{ KepPanel keppanel;
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
Program() { keppanel = new KepPanel(); keppanel.setBounds(10, 10, 200, 200); add(keppanel); setLayout(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); } public static void main(String args[]) { new Program(); }}
Az alábbi rajzoló utasítást:
g.drawImage(image, , , 200, 200, null);
Így is írhattuk volna:
g.drawImage(image, , , null);
Ekkor azonban a kép nem illeszkedik a panelen elhelyezett kép nagyságához. Nagyobb képnél csak akép bal felső sarka fog látszani.
Kép panelen 2
Program.java
import javax.swing.*;import java.awt.*;import javax.imageio.*;import java.io.*; class KepPanel extends JPanel{ Image image = null; KepPanel() throws IOException { image = ImageIO.read(new File("kep.png")); } @Override public void paintComponent(Graphics g) {
2015/10/31 01:12 65/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
g.drawImage(image, , , 100, 100, null); }} class Program extends JFrame{ KepPanel panel; Program() throws IOException { panel = new KepPanel(); panel.setBounds(10, 10, 150, 150); add(panel); setLayout(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); } public static void main(String args[]) throws IOException { new Program(); }}
JToggleButton
if(toggleButton.isSelected()) ...
Program01.java
import javax.swing.JFrame;import javax.swing.JToggleButton;import javax.swing.JButton;import java.awt.FlowLayout;import java.awt.event.ActionListener;import java.awt.event.ActionEvent; class Program01 extends JFrame implements ActionListener { JToggleButton toggleButton = new JToggleButton("Kapcsoló"); JButton button = new JButton("Mehet"); Program01() { button.addActionListener(this); setLayout(new FlowLayout()); add(toggleButton); add(button);
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); } public void actionPerformed(ActionEvent event) { if(toggleButton.isSelected()) { setTitle("Kiválasztva"); }else { setTitle("Nincs kiválasztva"); } } public static void main(String[] args) { new Program01(); }}
Figyeljük, hogy változott-e a gomb állapota:
Program01.java
import javax.swing.JFrame;import javax.swing.JToggleButton;import javax.swing.JButton;import java.awt.FlowLayout;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import java.awt.event.ItemListener;import java.awt.event.ItemEvent; class Program01 extends JFrame implements ActionListener, ItemListener { JToggleButton toggleButton = new JToggleButton("Kapcsoló"); JButton button = new JButton("Mehet"); Program01() { button.addActionListener(this); toggleButton.addItemListener(this); setLayout(new FlowLayout()); add(toggleButton); add(button); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); } public void actionPerformed(ActionEvent event) { if(toggleButton.isSelected()) { setTitle("Kiválasztva"); }else { setTitle("Nincs kiválasztva"); }
2015/10/31 01:12 67/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
} public void itemStateChanged(ItemEvent event) { setTitle(getTitle() + "_"); } public static void main(String[] args) { new Program01(); }}
Program01.java
import javax.swing.JFrame;import javax.swing.JToggleButton;import javax.swing.JButton;import java.awt.FlowLayout;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import java.awt.event.ItemListener;import java.awt.event.ItemEvent; class Program01 extends JFrame implements ActionListener, ItemListener { JToggleButton toggleButton = new JToggleButton("Kapcsoló"); JButton button = new JButton("Mehet"); Program01() { button.addActionListener(this); toggleButton.addItemListener(this); setLayout(new FlowLayout()); add(toggleButton); add(button); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); } public void actionPerformed(ActionEvent event) { if(toggleButton.isSelected()) { setTitle("Kiválasztva"); }else { setTitle("Nincs kiválasztva"); } } public void itemStateChanged(ItemEvent event) { if(event.getStateChange()==ItemEvent.SELECTED) { setTitle("Kiválasztva"); }else if(event.getStateChange()==ItemEvent.DESELECTED) { setTitle("Nincs kiválasztva"); } } public static void main(String[] args) {
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
new Program01(); }}
JFormattedTextField
Az alábbi példában csak egy telefonszámot szeretnénk megengedni beírni.
Program.java
import javax.swing.*;import java.text.*;import javax.swing.text.*; class Program extends JFrame{ JFormattedTextField mezo; Program() { MaskFormatter mf = null; try{ mf = new MaskFormatter("+36 (##) ###-####"); mf.setPlaceholderCharacter('_'); //Nemkötelező, de hasznos }catch(ParseException e){}; mezo = new JFormattedTextField(mf); mezo.setBounds(50, 50, 150, 30); add(mezo); setLayout(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); } public static void main(String args[]) { new Program(); }}
Csak a következő három karaktert szeretnénk elfogadni: „abc”.
mf = new MaskFormatter("**");mf.setPlaceholderCharacter('_');mf.setValidCharacters("abc");
2015/10/31 01:12 69/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
Karakter Leírás# Bármilyen szám érvényes (Character.isDigit)' Escape karakter, használhatók speciális formázó escape karakterekU Bármilyen karakter (Character.isLetter) A kisbetűk nagybetűssént viselkednekL Bármilyen karakter (Character.isLetter) A nagybetűk kisbetűsként értelmezendőkA Bármilyen karakter vagy szám (Character.isLetter vagy Character.isDigit)? Bármilyen karakter (Character.isLetter)* BármiH Bármilyen hexkarakter (0-9, a-f vagy A-F)
http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.htmlhttp://www.java2s.com/Tutorial/Java/0240__Swing/JFormattedTextField.htm
JSlider
A JSlider egy értékskála létrehozására való. A következő példaprogramban megadunk minimum ésmaximum értékeket, beállítjuk függőlegesre, adunk hozzá számozást. Amint változtatja felhasználó azértéket, azonnal megjelenítjük egy beviteli mezőben.
Program.java
import javax.swing.*;import javax.swing.event.*;import java.awt.*;class Program extends JFrame{ JSlider skala; JTextField mezo; Program() { skala = new JSlider(); mezo = new JTextField(); skala.setMinimum(); skala.setMaximum(100); skala.setValue(20); skala.setOrientation(SwingConstants.VERTICAL); skala.setLabelTable(skala.createStandardLabels(10)); skala.setPaintLabels(true); skala.addChangeListener(new skala_Change()); mezo.setSize(50, 30); mezo.setText("kezdetben"); setLayout(new FlowLayout()); add(skala); add(mezo); pack();
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(50, 300); setVisible(true); } class skala_Change implements ChangeListener { public void stateChanged(ChangeEvent e) { int a = skala.getValue(); mezo.setText(Integer.toString(a)); } } public static void main(String[] args) { new Program(); }}
JProgressBar
A következő program egy folyamatsávot jelenít meg, amely a 20-as értéknél áll. A nyomógombothasználva növelhetem annak értékét.
Program.java
import javax.swing.JFrame;import javax.swing.JProgressBar;import javax.swing.JButton;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;class Program extends JFrame{ JProgressBar folyamatsav; JButton gomb; Program() { folyamatsav = new JProgressBar(); gomb = new JButton("Növel"); folyamatsav.setMinimum(); folyamatsav.setMaximum(100); folyamatsav.setValue(20); folyamatsav.setBounds(50, 50, 200, 30); gomb.setBounds(100, 100, 100, 30); gomb.addActionListener(new Gomb_Click()); add(folyamatsav);
2015/10/31 01:12 71/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
add(gomb); setLayout(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); } class Gomb_Click implements ActionListener { public void actionPerformed(ActionEvent e) { int a = folyamatsav.getValue(); a++; folyamatsav.setValue(a); } } public static void main(String[] args) { new Program(); }}
Függőleges folyamatsávhoz állítsuk be a következőket:
folyamatsav.setBounds(50, 50, 30, 200);folyamatsav.setOrientation(SwingConstants.VERTICAL);
A javax.swing.SwingConstans felsorolt típust használjuk paraméterként.
Százalékos megjelenítés:
Program.java
import javax.swing.JFrame;import javax.swing.JProgressBar;import javax.swing.JButton;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import javax.swing.SwingConstants;class Program extends JFrame{ JProgressBar folyamatsav; JButton gomb; Program() { folyamatsav = new JProgressBar(); gomb = new JButton("Klikk ide"); folyamatsav.setMinimum(); folyamatsav.setMaximum(100); folyamatsav.setValue(20);
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
folyamatsav.setBounds(50, 50, 200, 30); folyamatsav.setStringPainted(true); gomb.setBounds(100, 100, 100, 30); gomb.addActionListener(new Gomb_Click()); add(folyamatsav); add(gomb); setLayout(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); } class Gomb_Click implements ActionListener { public void actionPerformed(ActionEvent e) { int a = folyamatsav.getValue(); a++; folyamatsav.setValue(a); folyamatsav.setString(a + " %"); } } public static void main(String[] argv) { new Program(); }}
JTree
Faszerkezet.
Program.java
import javax.swing.*; class Program extends JFrame{ JTree fa; Program() { fa = new JTree(); add(fa); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); setVisible(true);
2015/10/31 01:12 73/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
} public static void main(String args[]) { new Program(); }}
JSpinner
Program01.java
import javax.swing.JFrame;import javax.swing.JSpinner;import javax.swing.SpinnerModel;import javax.swing.SpinnerNumberModel;import java.awt.FlowLayout;import java.awt.Dimension; class Program01 extends JFrame{ SpinnerModel spinmodel; JSpinner lepteto; Program01() { int min = 2; int max = 15; int leptek = 1; int kezdoErtek = 9; spinmodel = new SpinnerNumberModel(kezdoErtek, min, max,leptek); lepteto = new JSpinner(spinmodel); Dimension d = lepteto.getPreferredSize(); d.width = 50; lepteto.setPreferredSize(d); setLayout(new FlowLayout()); add(lepteto); setSize(400, 300); setVisible(true); } public static void main(String args[]) { new Program01(); }}
Szintaxis:
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
SpinnerNumberModel(double value, double minimum, double maximum, doublestepSize)
SpinnerNumberModel(int value, int minimum, int maximum, int stepSize)
A változás figyelése:
delaySpinner.addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent e) { int szam = (Integer)delaySpinner.getModel().getValue(); }});
Ablakállapotok
Program.java
import javax.swing.JFrame;import java.awt.Frame;class Program extends JFrame{ Program() throws InterruptedException { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); // Várunk 5 másodpercet Thread.sleep (5000); setState ( JFrame.ICONIFIED ); // Várunk 5 másodpercet Thread.sleep (5000); setState ( JFrame.NORMAL ); // Várunk 5 másodpecet Thread.sleep (5000); setVisible (false); dispose(); // Kilépünk System.exit(); } public static void main(String args[]) throws InterruptedException {
2015/10/31 01:12 75/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
new Program(); }}
Elrendezéskezelés
Az elrendezéskezelésről
A setLayout() metódussal állítjuk. A JPanel komponens használata esetén a konstruktorban ismegadható az elrendezéskezelő.
Elrendezéskezelő osztályok:
java.awt.BorderLayoutjavax.swing.BoxLayoutjava.awt.CardLayoutjava.awt.FlowLayoutjava.awt.GridBagLayoutjava.awt.GridLayoutjava.swing.GroupLayoutjavax.swing.SprintLayout
javax.swing.BoxLayout
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"); Program01() { //PAGE_AXIS, X_AXIS, Y_AXIS, LINE_AXIS setLayout(new BoxLayout(getContentPane(), BoxLayout.LINE_AXIS)); add(gomb1); add(gomb2); add(gomb3);
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
pack(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new Program01(); }}
JPanel használatával:
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.LINE_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(); }}
2015/10/31 01:12 77/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
GridBagLayout
import java.awt.GridBagLayout;import java.awt.GridBagConstraints;
JPanel pane = new JPanel(new GridBagLayout());GridBagConstraints c = new GridBagConstraints(); panel1.add(aKomponens, c);
Minden komponenshez adhatunk saját GridBagConstraints objektumot, de ugyanazt is beállíthatjuk.
A GridBagConstraints a következő változókat tartalmazza:
gridx, gridy
Sorok és oszlopok megadása.
Az első mező címe: gridx=0 Az első sor címe: gridy=0
Az alapértelmezett: GridBagConstraints.RELATIVE
gridwidth, gridheight
Az oszlopok és sorok szélessége és magassága.
A előtt lévő sorral egyezen meg: GridBagConstraints.REMAINDERGridBagConstraints.RELATIVE
fill
Kitölti a rendelkezésre álló helyet vízszintesen vagy függőlegesen.
GridBagConstraints.VERTICALGridBagConstraints.HORIZONTAL
ipadx, ipady
Belső térköz.
insets
Külső térköz
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
anchor
Akkor használjuk ha komponens kisebb mint a rendelkezésére álló hely.
A következő konstansok használhatók:
GridBagConstraints.CENTER (alapértelmezés)PAGE_STARTPAGE_ENDLINE_STARTLINE_ENDFIRST_LINE_STARTFIRST_LINE_ENDLAST_LINE_ENDLAST_LINE_START
weightx, weighty
Vastagság
0.0 (alapértelmezett)1.0
További információk
http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html
BorderLayout
import java.awt.BorderLayout;
pane.add(button, BorderLayout.LINE_END);
BorderLayout:
button = new JButton("Button 3 (LINE_START)");pane.add(button, BorderLayout.LINE_START);
PAGE_STARTPAGE_ENDLINE_STARTLINE_ENDCENTER
http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html (BorderLayout)
2015/10/31 01:12 79/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
GridLayout
import java.awt.GridLayout;
Az első mindig a sor, a második paraméter mindig az oszlopok száma:
panel.setLayout(new GridLayout(1,)); panel.add(gomb1);panel.add(gomb2);
4 sor és 3 oszlopos példa:
Program01.java
import javax.swing.JFrame;import javax.swing.JButton;import java.awt.GridLayout; class Program01 extends JFrame{ JButton[] buttons; Program01() { buttons = new JButton[12]; for(int i=; i<12; i++) { buttons[i] = new JButton(); buttons[i].setText(Integer.toString(i)); add(buttons[i]); } setLayout(new GridLayout(4, 3)); pack(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new Program01(); }}
De panelon is használhatjuk a GridLayout elrendezéskezelőt:
Program01.java
import javax.swing.JFrame;
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
import javax.swing.JButton;import javax.swing.JPanel;import javax.swing.JTextField;import java.awt.GridLayout;import javax.swing.BoxLayout; class Program01 extends JFrame{ JButton[] buttons; JPanel buttonsPanel; JTextField displayTextField; Program01() { buttonsPanel = new JPanel(); displayTextField = new JTextField(); buttons = new JButton[12]; for(int i=; i<12; i++) { buttons[i] = new JButton(); buttons[i].setText(Integer.toString(i)); buttonsPanel.add(buttons[i]); } buttonsPanel.setLayout(new GridLayout(4, 3)); setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); add(displayTextField); add(buttonsPanel); pack(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new Program01(); }}
TrayIcon
Program01.java
import javax.swing.JFrame;import javax.swing.JButton;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;
2015/10/31 01:12 81/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
import java.awt.SystemTray;import java.awt.TrayIcon;import java.awt.AWTException;import javax.swing.ImageIcon;import javax.swing.JMenuItem;import javax.swing.JPopupMenu;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import javax.swing.JOptionPane; class Program01 extends JFrame{ JButton button1 = new JButton("Kilépés"); ImageIcon img = newImageIcon(this.getClass().getClassLoader().getResource("ikon.png")); JPopupMenu jpopup = new JPopupMenu(); Program01() { JMenuItem exampleMenuItem = new JMenuItem("Példa", newImageIcon("ikon24x24.png")); JMenuItem exitMenuItem = new JMenuItem("Kilépés"); exitMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(); } }); exampleMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(getContentPane(),"Példa"); } }); jpopup.add(exampleMenuItem); jpopup.addSeparator(); jpopup.add(exitMenuItem); TrayIcon trayIcon = new TrayIcon(img.getImage()); trayIcon.setImageAutoSize(true); trayIcon.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { jpopup.setLocation(e.getX(), e.getY());
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
jpopup.setInvoker(jpopup); jpopup.setVisible(true); } }); SystemTray sysTray = SystemTray.getSystemTray(); try { sysTray.add(trayIcon); } catch(AWTException e) { e.printStackTrace(); System.err.println("Rendszer tray ikon"); } button1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(); } }); add(button1); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); } public static void main(String args[]) { new Program01(); }}
http://docs.oracle.com/javase/tutorial/uiswing/misc/systemtray.html
Függelék
Füles ablak példa
Négypaneles példa, státuszbárral:
Program01.java
2015/10/31 01:12 83/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
import javax.swing.JFrame;import javax.swing.JTabbedPane;import javax.swing.JPanel;import javax.swing.JLabel;import java.awt.BorderLayout;import javax.swing.JMenuBar;import javax.swing.JMenu;import javax.swing.JMenuItem;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;import java.awt.Dimension; class Program01 extends JFrame implements ActionListener{ private JTabbedPane tabbedPane; private JPanel firstPanel; private JPanel secondPanel; private JPanel thirdPanel; private JPanel fourthPanel; private JMenuBar menuBar; private JMenuItem exitMenuItem; private StatusBar statusBar; public Program01() { setLayout( new BorderLayout() ); menuBar = new JMenuBar(); menuCreate(); statusBar = new StatusBar(); getContentPane().add(statusBar, java.awt.BorderLayout.SOUTH); firstPanelCreate(); secondPanelCreate(); thirdPanelCreate(); fourthPanelCreate(); tabbedPane = new JTabbedPane(); tabbedPane.addTab("Első", firstPanel); tabbedPane.addTab("Második", secondPanel); tabbedPane.addTab("Harmadik", thirdPanel); tabbedPane.addTab("Negyedik", fourthPanel); add(tabbedPane); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); setVisible(true); }
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
void firstPanelCreate() { firstPanel = new JPanel(); firstPanel.setLayout( null ); JLabel cimke1 = new JLabel( "Első panel felirata" ); cimke1.setBounds( 10, 15, 150, 20 ); firstPanel.add( cimke1 ); } void secondPanelCreate() { secondPanel = new JPanel(); secondPanel.setLayout( null ); JLabel cimke1 = new JLabel( "Második panel felirata" ); cimke1.setBounds( 10, 15, 150, 20 ); secondPanel.add( cimke1 ); } void thirdPanelCreate() { thirdPanel = new JPanel(); thirdPanel.setLayout( null ); JLabel cimke1 = new JLabel( "Harmadik panel felirata" ); cimke1.setBounds( 10, 15, 150, 20 ); thirdPanel.add( cimke1 ); } void fourthPanelCreate() { fourthPanel = new JPanel(); fourthPanel.setLayout( null ); JLabel cimke1 = new JLabel( "Harmadik panel felirata" ); cimke1.setBounds( 10, 15, 150, 20 ); fourthPanel.add( cimke1 ); } void menuCreate() { JMenu filemenu; filemenu = new JMenu("Fájl"); exitMenuItem = new JMenuItem("Kilépés"); exitMenuItem.addActionListener(this); setJMenuBar(menuBar); menuBar.add(filemenu); filemenu.add(exitMenuItem); } public void actionPerformed(ActionEvent e) { if(e.getSource() == exitMenuItem) System.exit(); }
2015/10/31 01:12 85/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
public static void main(String args[]) { new Program01(); } public class StatusBar extends JLabel { public StatusBar() { super(); super.setPreferredSize(new Dimension(100, 16)); setMessage("Készen van"); } public void setMessage(String message) { setText(" "+message); } }}
JToolBar
Program01.java
import javax.swing.JFrame;import javax.swing.JToolBar;import java.awt.BorderLayout;import javax.swing.JButton; class Program01 extends JFrame{ JToolBar toolBar = new JToolBar("Valami szöveg"); Program01() { JButton button = new JButton("Felirat"); button.setToolTipText("Szöveg"); toolBar.add(button); //~ add(toolBar, BorderLayout.PAGE_START); add(toolBar, BorderLayout.NORTH); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args)
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
{ new Program01(); }}
Esetleg:
public class myToolbar extends JToolBar{ public myToolbar() { setName("Eszköztár"); setBackground(new Color(245, 245, 245)); setOrientation(1); setBorderPainted(false); setFloatable(true); setOpaque(true); }}
Szeparátor
System.getProperty("line.separator")
NetBeans stílus
Program01.java
import javax.swing.JFrame;import javax.swing.JButton;import java.awt.event.ActionListener;import java.awt.event.ActionEvent; class Program01 extends JFrame{ private JButton gomb; Program01() { gomb = new JButton(); gomb.setText("Klikkelj ide"); gomb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { GombActionPerformed(e);
2015/10/31 01:12 87/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
} }); add(gomb); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); } private void GombActionPerformed(ActionEvent e) { } public static void main(String[] args) { try { for (javax.swing.UIManager.LookAndFeelInfo info :javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) {javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) {java.util.logging.Logger.getLogger(Program01.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) {java.util.logging.Logger.getLogger(Program01.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) {java.util.logging.Logger.getLogger(Program01.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) {java.util.logging.Logger.getLogger(Program01.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } new Program01().setVisible(true); }}
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
Swing szállak
Ha elindítunk egy Swing programot, akkor az összes tevékenység az EDT-ben fut. Az EDT az EventDispatching Thread szavak betűiből rövidítés. Ezért, ha kiteszünk egy JButton, amely egy időigényesprogramot futtat, a programunk várva a feladat befejezését, megmerevedik.
Ezért szoktuk használni a SwingUtilities osztályt. Ebben az osztályban az invokeLater() metódusbólindítjuk a programunkat, amely segítségével orvosolható a fenti probléma.
import javax.swing.SwingUtilities; ... public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Program01(); } }); }
A probléma orvosolható persze úgy is, hogy létrehozok egy újabb szálat, és abból futtatom azidőigényes tevékenységet. Ha két szálból azonban egyidejűleg nyúlunk egy Swing komponenshez,akkor megint problémáink lehetnek a invokeLater() nélkül.
Az invokeLater() tetszőleges worker szálból hívható, amely az EDT várólistájára helyezi a kívánttevékenységet.
Időzítő
javax.swing.Timer
A konstruktor:
Timer(int varakozas, ActionListener figyelo)
varakozas - milliszekundum a kezdés és az első esemény közöttfigyelo - előkísztő figyelő (pl. ActionListener), de lehet null is
http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.htmlhttp://docs.oracle.com/javase/6/docs/api/javax/swing/Timer.html
javax.swing.Timer timer = new javax.swing.Timer(induloVarakozas, this);timer.setInitialDelay(varakozas);
2015/10/31 01:12 89/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
timer.start();
Ablakállapotok kezelése
Az ablak bezárása előtt mentés:
Program01.java
import javax.swing.JFrame;import java.awt.event.WindowStateListener;import java.awt.event.WindowEvent;class Program01 extends JFrame{ Program01() { addWindowStateListener(new WindowStateListener() { public void windowStateChanged(WindowEvent e) { windowStateListener(e); } }); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(800, 600); setVisible(true); } private void windowStateListener(WindowEvent e) { if(e.getNewState()==WindowEvent.WINDOW_CLOSED) { //ide jön a mentés } } public static void main(String[] args) { new Program01(); }}
JLayeredPane
A JLayeredPane lehetővé teszi rétegek kezelését. A rétegkezelést Z index, vagy sorrendnek is hívjuk.
A következő példában nyomógombokat helyeztünk egymás felé:
import javax.swing.JLayeredPane;
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
...class RetegesPanel extends JLayeredPane { public RetegesPanel(){ setComponentZOrder(button1, 1); setComponentZOrder(button2, 1); setComponentZOrder(button3, ); }}
Ha az egyik gomb felé viszem az egeret, akkor az a gomb felülre kerül.
Ha szeretnénk mindig az adott Z sorrendben látni a gombokat, akkor használjuk a setLayer()metódust:
import javax.swing.JLayeredPane;...class RetegesPanel extends JLayeredPane { public RetegesPanel(){ setLayer(button1, ); setLayer(button2, ); setLayer(button3, 1); }}
Így, ha az egeret egy gomb felé viszem, az adott rétegben marad.
Az ide vonatkozó hivatalos dokumentáció
Fókusz
Az ablakos program esetén mindig van egy ablakunk, amelyet frame-nek is szoktunk nevezni. Azablakon 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. Mindig a fókuszban lévő komponensen tudunkegy billentyűnyomást figyelni.
Ha azt szeretnénk, hogy mindig figyeljünk bizonyos billentyűket, akkor a fókuszt tegyük mindig visszaaz ablakra:
this.requestFocus();
Néha szeretnénk a fókuszt tiltani, vagy éppen újra engedélyezni. A Component osztály rendelkezikegy setFocusable() metódussal. Szintaktikája:
setFocusable(boolean focusable)
Segítségével a Component osztály vagy azok leszármazott osztályaiból példányosított objektumoknakbeállítható a fókusz engedélyezése vagy tiltása.
Az ablakkeretre tehető komponensek (JButton, JTextField, stb) őse között szerepel a Component
2015/10/31 01:12 91/92 Java GUI Swing csomaggal
SzitWiki - http://szit.hu/
osztály, ezért mindegyiknél használható a metódus.
button1.setFocusable(false);
jDesktopPane
A jDesktopPane segítségével virtuális asztal létrehozása lehetséges. A virtuális asztalra jInternalFrameablakok helyezhetők. Az ablakoknak beállítható az átméretezhetőség, ikonállapotba helyezhetőség,maximalizálás stb.
https://docs.oracle.com/javase/tutorial/uiswing/components/internalframe.html
Használható Swing csomagok
javax.swing.plafjavax.swing.textjavax.swingjavax.swing.plaf.basicjavax.swing.text.htmljavax.swing.borderjavax.swing.plaf.metaljavax.swing.text.html.parserjavax.swing.colorchooserjavax.swing.plaf.multijavax.swing.text.rtfjavax.swing.eventjavax.swing.plaf.synthjavax.swing.treejavax.swing.filechooserjavax.swing.tablejavax.swing.undo
Legfelső szintű konténerek:
JFrameJDialogJApplet
A csomagok közül mi elsőnek javax.swing-et használjuk. A konténerek közül pedig a JFramekonténert, amely egy ablakot hoz létre a képernyőn. A következő programokban ezek használatátlátjuk.
Külső link
http://docs.oracle.com/javase/tutorial/uiswing/http://docs.oracle.com/javase/tutorial/uiswing/TOC.htmlhttp://docs.oracle.com/javase/tutorial/uiswing/components/icon.html (Ikon)
Last update:2015/10/29 19:41 oktatas:programozás:java:java_gui_swing http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
http://szit.hu/ Printed on 2015/10/31 01:12
http://docs.oracle.com/javase/tutorial/uiswing/components/frame.html (Frame létrehozása)http://docs.oracle.com/javase/tutorial/ui/index.htmlhttp://docs.oracle.com/javase/tutorial/uiswing/components/index.htmlhttp://docs.oracle.com/javase/tutorial/2d/TOC.html (2D)http://docs.oracle.com/javase/tutorial/2d/printing/index.html (Nyomtatás)
http://www.javabeginner.com (Igen jó tutorial!)http://www.javabeginner.com/java-swing/java-swing-tutorialhttp://www.cs.cf.ac.uk/Dave/HCI/HCI_Handout_CALLER/HCI_Handout_CALLER.htmlhttp://academicjava.com/JavaTutorial/JTabbedPaneExample.htmlhttp://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JList.html (JList)http://movingtofreedom.org/2007/11/11/displaying-a-scaled-image-in-java/ (Skálázható kép)http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JButton.html (Gombon kép)http://home.cogeco.ca/~ve3ll/jatutorg.htm (Grafika)http://mindprod.com/jgloss/image.html (Minden ami kép)http://download.oracle.com/javase/tutorial/uiswing/components/list.html (JList)http://download.oracle.com/javase/tutorial/uiswing/components/toplevel.htmlhttp://www.apl.jhu.edu/~hall/java/Java2D-Tutorial.htmlhttp://www.apl.jhu.edu/~hall/java/Swing-Tutorial/
http://php.scripts.psu.edu/djh300/cmpsc221/notes-graphics-intro.phphttp://zetcode.com/gfx/java2d/http://oreilly.com/catalog/java2d/chapter/ch04.html
From:http://szit.hu/ - SzitWiki
Permanent link:http://szit.hu/doku.php?id=oktatas:programoz%C3%A1s:java:java_gui_swing
Last update: 2015/10/29 19:41