This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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);
} 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.
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); }
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():
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.
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
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);
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.
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{
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() {
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(); }}
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");
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);
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:
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.
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
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));
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.
//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
@Override public int getColumnCount(){return 10;}; @Override public int getRowCount(){return 10;}; }; JTable table = new JTable(tableModel); JScrollPane jsp = new JScrollPane(table);
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:
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.
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(); }}
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)
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.
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);
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
Í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
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.
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.