Java a základy GUI #3
V minulém článku jsme si trochu rozšířili vědomosti o základních grafických ovládacích prvcích a nakonec jsme začali základy obsluhy událostí. V tomto navazujícím článku se zaměříme trochu podrobněji na události a ukážeme si jak můžeme volat více tlačítky různé metody a třídy.
V minulém článku jsme začali události a ukázali jsme si jak vytvořit událost pro jedno tlačítko. To je sice pěkné, ale pro složitější věcí nepoužitelné, protože jsme byli omezeni pouze na jednu událost definovanou v metodě actionPerformed.
V tomto článku si ukážeme Interface ActionListener, pomocí něhož můžeme vytvořit samostatnou událost pro více různých ovládacích prvků.
addActionListener
Velice jednoduchá je metoda addActionListener, která potřebuje implementaci ActionListener a její metody actionPerformed.
Možná to zní složitě, ale je to velice jednoduché.
Zjednodušeně by jsem to mohl napsat takto: vtvoříme si třídu a do ní implementujeme ActionLister, abychom mohli používat addActionListener. Pomocí AddActionListener si potom můžeme přiřadit událost pro jakýkoli objekt.
Pokud vám to stále není jasné, vyzkoušejte si následující příklad:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package default_package; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class simpleGUI extends JFrame implements ActionListener{ private Window jDialog1; public simpleGUI(){ super("Window"); setSize(100, 100); setVisible(true); Container cont = new Container(); cont = getContentPane(); FlowLayout layout = new FlowLayout(); cont.setLayout(layout); JButton submit = new JButton("Run"); cont.add(submit); setContentPane(cont); submit.addActionListener( new java.awt.event.ActionListener(){ public void actionPerformed(java.awt.event.ActionEvent evt) { JOptionPane.showMessageDialog(null,"Kliknuli jste na Run", "Program Run", JOptionPane.INFORMATION_MESSAGE ); }; }); } public void actionPerformed(ActionEvent e) { } } |
V příkladu jsme si vytvořili jednoduché okno s jediným tlačítkem Run typu JButton. K tomuto tlačítku jsme přidali pomocí addActionListener událost, která je přímo u něj definována jako vnitřní metodu.
Po kliknutí na toto tlačítko se vytvoří JOptionPane a vytvoří novou INFORMATION_MESSAGE.
Pomocí addActionLister můžeme však bez problémů volat i metody, které jsou již hotové a které jsou ve stejné, nebo popřípadě jiné třídě.
Vyzkoušejme si to.
Nejprve si vytvoříme dvě tlačítka a přidáme k nim události.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
JButton submit = new JButton("Run"); cont.add(submit); //pridani udalosti k prvnimu tlacitku submit.addActionListener(new java.awt.event.ActionListener () { public void actionPerformed(java.awt.event.ActionEvent evt) { //vola metodu print s parametrem "kliknuli jste na tlacitko"; print("kliknuli jste na tlačítko"); } }); JButton submit2 = new JButton("About"); cont.add(submit2); //prida udalost na druhe tlacitko submit2.addActionListener( new java.awt.event.ActionListener(){ public void actionPerformed(java.awt.event.ActionEvent evt ){ //vola se metoda about(); about(); } }); |
V prvním tlačítku voláme metodu print, a po kliknutí na druhé tlačítko voláme metodu about.
Nyní si vytvoříme tyto dvě metody:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//metoda print vypisuje do konzoly public void print( String msg ){ System.out.println( msg ); } //metoda abou obsahuje novou tridu about a vytvari jeji instanci public void about( ){ class window extends JFrame{ private static final long serialVersionUID = 1L; public window(){ //vytvori nove okno super("About"); setSize(100, 100); setVisible(true); //zde mohou byt volany dalsi metody } } new window(); } |
Je vidět že jako událost můžeme nastavit prakticky cokoli co potřebujeme a to velmi jednoduše.
Pro někoho může být tento článek možná trochu zmatený, ale pokud si příklady několikrát přečtete, tak zjistíte že je to vlastně velice jednoduché.
Jako úkol si můžete například vytvořit okno, v němž bude několik tlačítek, po kliknutí na každé z nich se zavolá jiná metoda, která změní pozadí celého Containeru.
Nápověda: Container si vytvořte jako globální proměnnou, aby jste k ní mohli v ostatních metodách přistupovat. Pozadí potom změníte jednoduše pomocí setBackground.
Své hotové řešení můžete umístit například do komentářů.
V příštím článku se podíváme jak snadno vytvořit menu v naší aplikaci.
Mohlo by vás zajímat:
Java a základy GUI#1
Java a základy GUI#2
Java a základy GUI#4
Tak jsem zkusil vámi zadaný "program" a narazil jsem na chybu… GUI teprv začínam, takže zkušeností mam vážně málo, takže prosím jakéhokoliv profíka o pomoc… Tady je můj kód:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class moje extends JFrame implements ActionListener
{
public Container cont;
public moje()
{
super("Window title");
setSize(500,100);
Dimension obrazovka = Toolkit.getDefaultToolkit().getScre enSize();
setLocation(obrazovka.width/5*2, obrazovka.height/5*2);
setDefaultCloseOperation(JFrame.EXI T_ON_CLOSE);
setVisible(true);
Container cont = new Container();
cont = getContentPane();
FlowLayout layout = new FlowLayout();
cont.setLayout(layout);
cont.setBackground(Color.white);
JButton order = new JButton("proveď");
cont.add(order);
order.addActionListener(this);
setContentPane(cont);
}
public void actionPerformed(ActionEvent evt)
{
cont.setBackground(Color.BLUE);
}
}
Chyba je v tomto radku:
Container cont = new Container();
Protoz e mas nadefinovanou globalni promennou, kterou vlastne nepouzijes. Nahrad tento radek pouze timto:
cont = new Container();
Pricem z se pouzije public promenna cont.
Paráda=) Díky moc, sám bych na to nepřišel…
P.S. V seriálech jen tak dál. Prolez už jsem něco webů a tutorialů, ale u vás jsem si toho odnes nejvíc. Díky
package ukol;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Main extends JFrame implements ActionListener{
Container c;
public void cerna(){
c=getContentPane();
c.setBackground(Color.BLACK);
setSize(500,500);
FlowLayout ok=new FlowLayout();
c.setLayout(ok);
}
public void bila(){
c=getContentPane();
c.setBackground(Color.WHITE);
setSize(100,100);
FlowLayout ok=new FlowLayout();
c.setLayout(ok);
}
public Main(){
setTitle("Bez nadpisu");
c=getContentPane();
setSize(300,300);
FlowLayout ok=new FlowLayout();
c.setLayout(ok);
JButton jedna=new JButton("Cerna a velke");
c.add(jedna);
jedna.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent ev){
cerna();
}
}
);
JButton dva=new JButton("Bila a male");
c.add(dva);
dva.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent evou){
bila();
}
}
);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Main m=new Main();m.setVisible(true);
}
public void actionPerformed(ActionEvent e){}
}