[[:oktatas:programozás:java|< Java]] ====== Java GUI Swing Alternatív módon ====== * **Szerző:** Sallai András * Copyright (c) 2011, Sallai András * Szerkesztve: 2011, 2020 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Bevezetés ===== Alternatív megoldásokat láthatunk a swing komponensek használatára. ===== JFrame örökítése ===== import javax.swing.*; class Ablak extends JFrame { Ablak() { this.setVisible(true); this.setBounds(50,50,300,100); } public static void main(String args[]) { new Ablak(); } } ===== A Dimension osztály használata ===== A Dimension osztály segítségével ablakok méretet tudjuk meghatározni. import javax.swing.JButton; import javax.swing.JFrame; import java.awt.Dimension; class Ablak extends JFrame { JButton GombElso; Ablak() { this.setSize(new Dimension(450, 130)); GombElso = new JButton(); this.setVisible(true); this.setLayout(null); GombElso.setText("Valami"); GombElso.setBounds(10,10, 100, 50); this.add(GombElso); } public static void main(String args[]) { new Ablak(); } } ===== Eseménykezelés megoldások ===== ==== Eseménykezelés névtelen osztályhívással ==== Meghívom az ActionListener interfészt, és hívás helyén megvalósítom a a kötlező actionPerformed() metódust. import java.awt.event.*; import javax.swing.*; class Program extends JFrame { JButton gomb; Program() { gomb = new JButton("Nyomj le!"); gomb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setTitle("Lenyomták"); } }); add(gomb); setSize(200, 100); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new Program(); } } ==== Eseménykezelés az ActionListener implementálásával ==== A Program osztályunk implementálja a ActionListener interfészt, így kötelező megvalósítanunk az osztályunkban egy actionPerformed() metódust. Az .addActionListener() metódus this paramétere itt annyit jelent, hogy ez az osztály implementálja az eseményfigyelőt. 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(0); } public static void main(String args[]) { new Program(); } } 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(0); } Jelenleg csak egyetlen komponenshez rendeltünk eseményfigyelőt, így nem használtuk fel az "e" változót sem. ==== Több komponens ==== 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); } public void actionPerformed(ActionEvent e) { if(e.getSource() == kilepesgomb) System.exit(0); 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és beépített osztállyal ==== import java.awt.Dimension; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; class Ablak extends JFrame { JButton gombElso; Ablak() { gombElso = new JButton(); gombElso.setText("Valami"); gombElso.setBounds(10,10, 100, 50); gombElso.addActionListener(new ButtonListener1()); this.add(gombElso); this.setLayout(null); this.setSize(new Dimension(450, 130)); this.setVisible(true); } public static void main(String args[]) { new Ablak(); } class ButtonListener1 implements ActionListener { public void actionPerformed(ActionEvent e) { gombElso.setText("Más"); } } } ===== Időzítés a Swing csomag Timer osztályával ===== ==== Példa1 ==== import javax.swing.*; import java.awt.event.*; class Program extends JFrame { Program() { Timer t = new Timer(2000, new ActionListener() { public void actionPerformed(ActionEvent e) { if(getTitle()=="Semmi") setTitle("Valami"); else setTitle("Semmi"); } }); t.start(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 300); setVisible(true); } public static void main(String args[]) { new Program(); } } Az időzítés leállítása: t.stop(); ==== Példa2 ==== import javax.swing.*; import java.awt.event.*; class Program extends JFrame { Program() { ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, "Üzi"); } }; Timer timer = new Timer(5000, listener); timer.start(); setSize(800, 600); setVisible(true); } public static void main(String args[]) { new Program(); } } ==== Timer link ==== * http://www.leepoint.net/notes-java/other/10time/20timer.html * http://stackoverflow.com/questions/1006611/java-swing-timer * http://docs.oracle.com/javase/6/docs/api/javax/swing/Timer.html ===== Az ablak középre igazítása ===== ==== A JFrame bővítése ==== A középre igazításról a Java Swing fejezetben van néhány példa. Itt most a JFrame osztályból egy saját osztály készítünk és azt bővítjük egy metódussal. import javax.swing.JFrame; import javax.swing.JLabel; import java.awt.FlowLayout; import java.awt.GraphicsEnvironment; import java.awt.Point; class SFrame extends JFrame { public void setCenter() { Point center = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint(); int x =(int) center.getX() - (this.getWidth()/2); int y =(int) center.getY() - (this.getHeight()/2); Point windowCenter = new Point(x, y); this.setLocation(windowCenter); } } A felhasználása: import javax.swing.JFrame; import javax.swing.JButton; class Program01 extends SFrame { JButton closeButton = new JButton("Bezár"); public Program01() { this.closeButton.setBounds(100, 100, 100, 30); this.closeButton.addActionListener(event -> closeButtonAction()); this.add(closeButton); this.setLayout(null); this.setSize(800, 600); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setCenter(); this.setVisible(true); } public void closeButtonAction() { System.exit(0); } public static void main(String[] args) { Program01 prog = new Program01(); } }