JAVATM GUI TUTORIAL

Menü

JAVATM GUI Tutorial > Menük   |   Applet   Forráskód   Letöltések

Bevezetés

Menüket sokféle panelre rakhatunk, leggyakrabban azonban java.awt.Frame, javax.swing.JFrame, javax.swing.JInternalFrame és javax.swing.JApplet objektumok esetében szoktuk alkalmazni. Általában akkor érdemes menüket használni, ha sok gombot, vagy más kezelőelemet kellene elhelyezni az ablak felületén. A menük kapcsán meg kell említeni, hogy a menükhöz háromféle osztály használata szükséges:

  • Menubar (java.awt.MenuBar, javax.swing.JMenuBar): Ez egy speciális konténer osztály, amely általában része a frame- vagy JApplet jellegű osztályoknak. Ide kerülnek a menük.
  • Menu (java.awt.Menu, javax.swing.JMenu): Ez tulajdonképpen maga a menü, amelyből almenük nyílhatnak és menüelemeket is tartalmazhat.
  • MenuItem (java.awt.MenuItem, javax.swing.JMenuItem, javax.swing.JCheckBoxMenuItem, javax.swing.JRadioButtonMenuItem): Ez a menüelem, lehet egyszerű menüelem, de a javax.swing csomag már jelölőnégyzetet, rádiógombot is tartalmaz, amelyet menükbe helyezhetünk el, és ezáltal nem kell külön panelt készíteni néhány darab kezelőelem miatt.

Az alábbi példában a menük segítségével egy cimke feliratát és színét változtathatjuk.



Menü létrehozása

Fontos, hogy minden egyes menüt és menüelemet hozzunk létre külön változónévvel, mert később szükség lesz rá. Hozzuk létre az objektumokat, majd készítsük el a menü struktúráját. A menüket adjuk hozzá egy Menubar objektumhoz. Végül állítsuk be a frame (vagy applet) Menubar-ját a setMenuBar(MenuBar) vagy pedig a setJMenuBar(JMenuBar) függvényével. Tulajdonképpen mindegy milyen sorrendben hozzuk létre az objektumokat, arra kell figyelni, hogy milyen a menü szerkezete. A Menubar objektumot akkor is hozzá lehet adni, mikor létrejöt, de bosszúságot okozhat, ha a végén lefelejtjük.

private JMenu menu; private JMenu colorMenu; private JMenuItem redItem; private JMenuItem greenItem; private JMenuItem blueItem; private JMenu submenu; private JRadioButtonMenuItem radioItem1; private JRadioButtonMenuItem radioItem2; private JCheckBoxMenuItem checkboxItem1; private JCheckBoxMenuItem checkboxItem2; private ButtonGroup buttonGroup; private JMenuBar menubar; ... menu = new JMenu("Menu"); colorMenu = new JMenu("Color"); submenu = new JMenu("Submenu"); redItem = new JMenuItem("Red"); greenItem = new JMenuItem("Green"); blueItem = new JMenuItem("Blue"); radioItem1 = new JRadioButtonMenuItem("Radio1"); radioItem2 = new JRadioButtonMenuItem("Radio2"); checkboxItem1 = new JCheckBoxMenuItem("Checkbox1"); checkboxItem2 = new JCheckBoxMenuItem("Checkbox2"); buttonGroup = new ButtonGroup(); menubar = new JMenuBar(); this.setJMenuBar(menubar); menubar.add(menu); menubar.add(colorMenu); menu.add(submenu); submenu.add(radioItem1); submenu.add(radioItem2); // radio buttons in one group, checkboxes buttonGroup.add(radioItem1); buttonGroup.add(radioItem2); submenu.add(checkboxItem1); submenu.add(checkboxItem2); colorMenu.add( redItem ); colorMenu.add( greenItem ); colorMenu.add( blueItem );

Az összetartozó rádiógombokat csoportba kell foglalni, hiszen a nem Igen/Nem választ akarunk beállítani, hanem több lehetőség közül szeretnénk választani.

Eseménykezelés

Következő lépésként az egyes menüelemekhez hozzá kell adni az eseményfigyelőket. Ez hagyományos menü és rádiógombok esetén az java.awt.event.ActionListener, jelölőnégyzetek esetén pedig a java.awt.ItemListener lesz.

radioItem1.addActionListener(this); radioItem2.addActionListener(this); checkboxItem1.addItemListener(this); checkboxItem2.addItemListener(this); redItem.addActionListener( this ); greenItem.addActionListener( this ); blueItem.addActionListener( this );

Mint korábbi a korábbi példaprogramok esetén, most is a főosztályban kezeljük le az eseményeket. Az osztályban ezért implementálni kell az java.awt.event.ActionListener és a java.awt.ItemListener metódusait. Az void actionPerformed(ActionEvent) függvényben csak azokat az eseményeket kell lekezelni, amelyeket a menüelemekhez és a rádiógombokhoz kötünk, a void itemStateChanged(ItemEvent) függvény csak jelölőnégyzetek eseményeiért lesz felelős.

A rádiógombokkal és a jelölőnégyzetekkel a feliratot a Color menü elemeivel pedig a felirat színét változtatjuk.


public void actionPerformed(ActionEvent e) { if(e.getSource().equals(radioItem1)) { label.setText("Radio1 is selected"); } if(e.getSource().equals(radioItem2)) { label.setText("Radio2 is selected"); } if(e.getSource().equals(redItem)) { label.setForeground( Color.RED ); } if(e.getSource().equals(greenItem)) { label.setForeground( Color.GREEN ); } if(e.getSource().equals(blueItem)) { label.setForeground( Color.BLUE ); } } public void itemStateChanged(ItemEvent e) { if(e.getSource().equals(checkboxItem1)) { label.setText("Checkbox1 is selected"); } if(e.getSource().equals(checkboxItem2)) { label.setText("Checkbox2 is selected"); } }

Ezzel el is készült ez a kis példaprogram.

Forráskód

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MenuExampleApplet extends JApplet implements ActionListener,ItemListener { private JLabel label; private JMenu menu; private JMenu colorMenu; private JMenuItem redItem; private JMenuItem greenItem; private JMenuItem blueItem; private JMenu submenu; private JRadioButtonMenuItem radioItem1; private JRadioButtonMenuItem radioItem2; private JCheckBoxMenuItem checkboxItem1; private JCheckBoxMenuItem checkboxItem2; private ButtonGroup buttonGroup; private JMenuBar menubar; public void buildGui() { menu = new JMenu("Menu"); colorMenu = new JMenu("Color"); submenu = new JMenu("Submenu"); redItem = new JMenuItem("Red"); greenItem = new JMenuItem("Green"); blueItem = new JMenuItem("Blue"); radioItem1 = new JRadioButtonMenuItem("Radio1"); radioItem2 = new JRadioButtonMenuItem("Radio2"); checkboxItem1 = new JCheckBoxMenuItem("Checkbox1"); checkboxItem2 = new JCheckBoxMenuItem("Checkbox2"); buttonGroup = new ButtonGroup(); menubar = new JMenuBar(); this.setJMenuBar(menubar); menubar.add(menu); menubar.add(colorMenu); menu.add(submenu); //menu.add(exitItem); submenu.add(radioItem1); submenu.add(radioItem2); buttonGroup.add(radioItem1); buttonGroup.add(radioItem2); submenu.add(checkboxItem1); submenu.add(checkboxItem2); colorMenu.add( redItem ); colorMenu.add( greenItem ); colorMenu.add( blueItem ); label = new JLabel(" Menu example "); add(label); radioItem1.addActionListener(this); radioItem2.addActionListener(this); checkboxItem1.addItemListener(this); checkboxItem2.addItemListener(this); redItem.addActionListener( this ); greenItem.addActionListener( this ); blueItem.addActionListener( this ); } // event handling of menus and radio buttons public void actionPerformed(ActionEvent e) { if(e.getSource().equals(radioItem1)) { label.setText("Radio1 is selected"); } if(e.getSource().equals(radioItem2)) { label.setText("Radio2 is selected"); } if(e.getSource().equals(redItem)) { label.setForeground( Color.RED ); } if(e.getSource().equals(greenItem)) { label.setForeground( Color.GREEN ); } if(e.getSource().equals(blueItem)) { label.setForeground( Color.BLUE ); } } // event handling of checkboxes public void itemStateChanged(ItemEvent e) { if(e.getSource().equals(checkboxItem1)) { label.setText("Checkbox1 is selected"); } if(e.getSource().equals(checkboxItem2)) { label.setText("Checkbox2 is selected"); } } public void init() { buildGui(); repaint(); } }

Letöltés

Fordítás J2SDK 1.4 vagy magasabb verziójával.
# > javac MenuExampleApplet.java
Applet: MenuExampleApplet.java
Stand-alone változat: MenuExample.java



Vissza a lap tetjére