Menu là một trong những thành phần cơ bản của một ứng dụng Java Swing, đây là nơi chứa tất cả các phím chức năng của ứng dụng. Để tạo một menu trong Java Swing chúng ta phải sử dụng các class sau:
- JMenu – Tạo một menu bar.
- JMenu – Tạo menu.
- JMenuItem – Các phần tử con trong JMenu.
- JMenuItemListener – Tạo các trình xử lý sự kiện.
Constructor
Để khởi tạo JMenuBar và JMenu chúng ta có các constructor cơ bản sau:
- JMenuBar() : Tạo một MenuBar.
- JMenu() : Tạo một Menu rỗng.
- JMenu(String name) : Tạo một menu với tên được chỉ định.
- JMenu(String name, boolean b) : Tạo menu với tên được chỉ định, và boolean chỉ định menu có thể kéo ra khỏi menu bar hay không.
Một số hàm thường xuyên sử dụng:
- add(JMenu c) : Thêm một menu vào MenuBar.
- add(Component c) : Thêm một component vào JMenu.
- add(Component c, int index) :Thêm một component vào JMenu tại vị trí index.
- add(JMenuItem menuItem) : Thêm một MenuItem vào cuối menu.
- add(String s) : Thêm một menu mới với tên được chỉ định và gắn vào cuối menu.
- getItem(int index) :Trả về MenuItem tại vị trí Index.
Ví dụ tạo Menu đơn giản
Trong phần này mình sẽ tạo một MenuBar gồm 3 phần tử, xử lý sự kiện khi chọn một MenuItem bất kỳ thì sẽ xuất tên nó vào JTextField.
import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; class SimpleMenus extends JApplet { private JTextField t = new JTextField(15); private ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent e) { t.setText(((JMenuItem) e.getSource()).getText()); } }; private JMenu[] menus = { new JMenu("Winken"), new JMenu("Blinken"), new JMenu("Nod")}; private JMenuItem[] items = { new JMenuItem("Fee"), new JMenuItem("Fi"), new JMenuItem("Fo"), new JMenuItem("Zip"), new JMenuItem("Zap"), new JMenuItem("Zot"), new JMenuItem("Olly"), new JMenuItem("Oxen"), new JMenuItem("Free")}; public void init() { for (int i = 0; i < items.length; i++) { items[i].addActionListener(al); menus[i % 3].add(items[i]); } JMenuBar mb = new JMenuBar(); for (int i = 0; i < menus.length; i++) { mb.add(menus[i]); } setJMenuBar(mb); Container cp = getContentPane(); cp.setLayout(new FlowLayout()); cp.add(t); } public static void main(String[] args) { run(new SimpleMenus(), 200, 200); } public static void run(JApplet applet, int width, int height) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.getContentPane().add(applet); frame.setSize(width, height); applet.init(); applet.start(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }
Output
Tạo SubMenu trong Java Swing
Trong phần này chúng ta sẽ cùng nhau tìm cách tạo ra các menu con bên trong một MenuItem con.
import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyEvent; import javax.swing.*; class SwingMenus extends JApplet { private String[] flavors = { "Chocolate", "Strawberry", "Vanilla Fudge Swirl", "Mint Chip", "Mocha Almond Fudge", "Rum Raisin", "Praline Cream", "Mud Pie" }; private JTextField t = new JTextField("No flavor", 30); private JMenuBar mb1 = new JMenuBar(); private JMenu f = new JMenu("File"), m = new JMenu("Flavors"), s = new JMenu("Safety"); // Alternative approach: private JCheckBoxMenuItem[] safety = { new JCheckBoxMenuItem("Guard"), new JCheckBoxMenuItem("Hide") }; private JMenuItem[] file = { new JMenuItem("Open") }; // A second menu bar to swap to: private JMenuBar mb2 = new JMenuBar(); private JMenu fooBar = new JMenu("fooBar"); private JMenuItem[] other = { // Adding a menu shortcut (mnemonic) is very // simple, but only JMenuItems can have them // in their constructors: new JMenuItem("Foo", KeyEvent.VK_F), new JMenuItem("Bar", KeyEvent.VK_A), // No shortcut: new JMenuItem("Baz"), }; private JButton b = new JButton("Swap Menus"); class BL implements ActionListener { public void actionPerformed(ActionEvent e) { JMenuBar m = getJMenuBar(); setJMenuBar(m == mb1 ? mb2 : mb1); validate(); // Refresh the frame } } class ML implements ActionListener { public void actionPerformed(ActionEvent e) { JMenuItem target = (JMenuItem) e.getSource(); String actionCommand = target.getActionCommand(); if (actionCommand.equals("Open")) { String s = t.getText(); boolean chosen = false; for (int i = 0; i < flavors.length; i++) if (s.equals(flavors[i])) chosen = true; if (!chosen) t.setText("Choose a flavor first!"); else t.setText("Opening " + s + ". Mmm, mm!"); } } } class FL implements ActionListener { public void actionPerformed(ActionEvent e) { JMenuItem target = (JMenuItem) e.getSource(); t.setText(target.getText()); } } // Alternatively, you can create a different // class for each different MenuItem. Then you // Don't have to figure out which one it is: class FooL implements ActionListener { public void actionPerformed(ActionEvent e) { t.setText("Foo selected"); } } class BarL implements ActionListener { public void actionPerformed(ActionEvent e) { t.setText("Bar selected"); } } class BazL implements ActionListener { public void actionPerformed(ActionEvent e) { t.setText("Baz selected"); } } class CMIL implements ItemListener { public void itemStateChanged(ItemEvent e) { JCheckBoxMenuItem target = (JCheckBoxMenuItem) e.getSource(); String actionCommand = target.getActionCommand(); if (actionCommand.equals("Guard")) t.setText("Guard the Ice Cream! " + "Guarding is " + target.getState()); else if (actionCommand.equals("Hide")) t.setText("Hide the Ice Cream! " + "Is it hidden? " + target.getState()); } } public void init() { ML ml = new ML(); CMIL cmil = new CMIL(); safety[0].setActionCommand("Guard"); safety[0].setMnemonic(KeyEvent.VK_G); safety[0].addItemListener(cmil); safety[1].setActionCommand("Hide"); safety[1].setMnemonic(KeyEvent.VK_H); safety[1].addItemListener(cmil); other[0].addActionListener(new FooL()); other[1].addActionListener(new BarL()); other[2].addActionListener(new BazL()); FL fl = new FL(); for (int i = 0; i < flavors.length; i++) { JMenuItem mi = new JMenuItem(flavors[i]); mi.addActionListener(fl); m.add(mi); // Add separators at intervals: if ((i + 1) % 3 == 0) m.addSeparator(); } for (int i = 0; i < safety.length; i++) s.add(safety[i]); s.setMnemonic(KeyEvent.VK_A); f.add(s); f.setMnemonic(KeyEvent.VK_F); for (int i = 0; i < file.length; i++) { file[i].addActionListener(fl); f.add(file[i]); } mb1.add(f); mb1.add(m); setJMenuBar(mb1); t.setEditable(false); Container cp = getContentPane(); cp.add(t, BorderLayout.CENTER); // Set up the system for swapping menus: b.addActionListener(new BL()); b.setMnemonic(KeyEvent.VK_S); cp.add(b, BorderLayout.NORTH); for (int i = 0; i < other.length; i++) fooBar.add(other[i]); fooBar.setMnemonic(KeyEvent.VK_B); mb2.add(fooBar); } public static void main(String[] args) { run(new SwingMenus(), 300, 300); } public static void run(JApplet applet, int width, int height) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.getContentPane().add(applet); frame.setSize(width, height); applet.init(); applet.start(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }
Output
Nguồn