234 lines
8.5 KiB
Java
234 lines
8.5 KiB
Java
/*
|
|
* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* - Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* - Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* - Neither the name of Oracle or the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
import java.awt.*;
|
|
import java.awt.event.*;
|
|
import javax.swing.*;
|
|
|
|
/* MenuDemo.java requires images/middle.gif. */
|
|
|
|
/*
|
|
* This class is just like MenuLookDemo, except the menu items
|
|
* actually do something, thanks to event listeners.
|
|
*/
|
|
public class MenuDemo implements ActionListener, ItemListener {
|
|
JTextArea output;
|
|
JScrollPane scrollPane;
|
|
String newline = "\n";
|
|
|
|
public JMenuBar createMenuBar() {
|
|
JMenuBar menuBar;
|
|
JMenu menu, submenu;
|
|
JMenuItem menuItem;
|
|
JRadioButtonMenuItem rbMenuItem;
|
|
JCheckBoxMenuItem cbMenuItem;
|
|
|
|
//Create the menu bar.
|
|
menuBar = new JMenuBar();
|
|
|
|
//Build the first menu.
|
|
menu = new JMenu("A Menu");
|
|
menu.setMnemonic(KeyEvent.VK_A);
|
|
menu.getAccessibleContext().setAccessibleDescription(
|
|
"The only menu in this program that has menu items");
|
|
menuBar.add(menu);
|
|
|
|
//a group of JMenuItems
|
|
menuItem = new JMenuItem("A text-only menu item",
|
|
KeyEvent.VK_T);
|
|
//menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead
|
|
menuItem.setAccelerator(KeyStroke.getKeyStroke(
|
|
KeyEvent.VK_1, ActionEvent.ALT_MASK));
|
|
menuItem.getAccessibleContext().setAccessibleDescription(
|
|
"This doesn't really do anything");
|
|
menuItem.addActionListener(this);
|
|
menu.add(menuItem);
|
|
|
|
ImageIcon icon = createImageIcon("images/middle.gif");
|
|
menuItem = new JMenuItem("Both text and icon", icon);
|
|
menuItem.setMnemonic(KeyEvent.VK_B);
|
|
menuItem.addActionListener(this);
|
|
menu.add(menuItem);
|
|
|
|
menuItem = new JMenuItem(icon);
|
|
menuItem.setMnemonic(KeyEvent.VK_D);
|
|
menuItem.addActionListener(this);
|
|
menu.add(menuItem);
|
|
|
|
//a group of radio button menu items
|
|
menu.addSeparator();
|
|
ButtonGroup group = new ButtonGroup();
|
|
|
|
rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
|
|
rbMenuItem.setSelected(true);
|
|
rbMenuItem.setMnemonic(KeyEvent.VK_R);
|
|
group.add(rbMenuItem);
|
|
rbMenuItem.addActionListener(this);
|
|
menu.add(rbMenuItem);
|
|
|
|
rbMenuItem = new JRadioButtonMenuItem("Another one");
|
|
rbMenuItem.setMnemonic(KeyEvent.VK_O);
|
|
group.add(rbMenuItem);
|
|
rbMenuItem.addActionListener(this);
|
|
menu.add(rbMenuItem);
|
|
|
|
//a group of check box menu items
|
|
menu.addSeparator();
|
|
cbMenuItem = new JCheckBoxMenuItem("A check box menu item");
|
|
cbMenuItem.setMnemonic(KeyEvent.VK_C);
|
|
cbMenuItem.addItemListener(this);
|
|
menu.add(cbMenuItem);
|
|
|
|
cbMenuItem = new JCheckBoxMenuItem("Another one");
|
|
cbMenuItem.setMnemonic(KeyEvent.VK_H);
|
|
cbMenuItem.addItemListener(this);
|
|
menu.add(cbMenuItem);
|
|
|
|
//a submenu
|
|
menu.addSeparator();
|
|
submenu = new JMenu("A submenu");
|
|
submenu.setMnemonic(KeyEvent.VK_S);
|
|
|
|
menuItem = new JMenuItem("An item in the submenu");
|
|
menuItem.setAccelerator(KeyStroke.getKeyStroke(
|
|
KeyEvent.VK_2, ActionEvent.ALT_MASK));
|
|
menuItem.addActionListener(this);
|
|
submenu.add(menuItem);
|
|
|
|
menuItem = new JMenuItem("Another item");
|
|
menuItem.addActionListener(this);
|
|
submenu.add(menuItem);
|
|
menu.add(submenu);
|
|
|
|
//Build second menu in the menu bar.
|
|
JMenuItem anotherMenu = new JMenuItem("Another Menu");
|
|
anotherMenu.setMnemonic(KeyEvent.VK_N);
|
|
anotherMenu.getAccessibleContext().setAccessibleDescription("This menu does nothing");
|
|
anotherMenu.addActionListener(new ActionListener() {
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
System.out.println("Click!");
|
|
// JOptionPane.showMessageDialog(null, "Hello There!");
|
|
}
|
|
});
|
|
menuBar.add(anotherMenu);
|
|
|
|
return menuBar;
|
|
}
|
|
|
|
public Container createContentPane() {
|
|
//Create the content-pane-to-be.
|
|
JPanel contentPane = new JPanel(new BorderLayout());
|
|
contentPane.setOpaque(true);
|
|
|
|
//Create a scrolled text area.
|
|
output = new JTextArea(5, 30);
|
|
output.setEditable(false);
|
|
scrollPane = new JScrollPane(output);
|
|
|
|
//Add the text area to the content pane.
|
|
contentPane.add(scrollPane, BorderLayout.CENTER);
|
|
|
|
return contentPane;
|
|
}
|
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
JMenuItem source = (JMenuItem)(e.getSource());
|
|
String s = "Action event detected."
|
|
+ newline
|
|
+ " Event source: " + source.getText()
|
|
+ " (an instance of " + getClassName(source) + ")";
|
|
output.append(s + newline);
|
|
output.setCaretPosition(output.getDocument().getLength());
|
|
}
|
|
|
|
public void itemStateChanged(ItemEvent e) {
|
|
JMenuItem source = (JMenuItem)(e.getSource());
|
|
String s = "Item event detected."
|
|
+ newline
|
|
+ " Event source: " + source.getText()
|
|
+ " (an instance of " + getClassName(source) + ")"
|
|
+ newline
|
|
+ " New state: "
|
|
+ ((e.getStateChange() == ItemEvent.SELECTED) ?
|
|
"selected":"unselected");
|
|
output.append(s + newline);
|
|
output.setCaretPosition(output.getDocument().getLength());
|
|
}
|
|
|
|
// Returns just the class name -- no package info.
|
|
protected String getClassName(Object o) {
|
|
String classString = o.getClass().getName();
|
|
int dotIndex = classString.lastIndexOf(".");
|
|
return classString.substring(dotIndex+1);
|
|
}
|
|
|
|
/** Returns an ImageIcon, or null if the path was invalid. */
|
|
protected static ImageIcon createImageIcon(String path) {
|
|
java.net.URL imgURL = MenuDemo.class.getResource(path);
|
|
if (imgURL != null) {
|
|
return new ImageIcon(imgURL);
|
|
} else {
|
|
System.err.println("Couldn't find file: " + path);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create the GUI and show it. For thread safety,
|
|
* this method should be invoked from the
|
|
* event-dispatching thread.
|
|
*/
|
|
private static void createAndShowGUI() {
|
|
//Create and set up the window.
|
|
JFrame frame = new JFrame("MenuDemo");
|
|
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
|
|
//Create and set up the content pane.
|
|
MenuDemo demo = new MenuDemo();
|
|
frame.setJMenuBar(demo.createMenuBar());
|
|
frame.setContentPane(demo.createContentPane());
|
|
|
|
//Display the window.
|
|
frame.setSize(450, 260);
|
|
frame.setVisible(true);
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
//Schedule a job for the event-dispatching thread:
|
|
//creating and showing this application's GUI.
|
|
javax.swing.SwingUtilities.invokeLater(new Runnable() {
|
|
public void run() {
|
|
createAndShowGUI();
|
|
}
|
|
});
|
|
}
|
|
} |