第10章 菜單和工具條
菜單和工具條是現代使用者界面的重要組成部分。Swing提供了對這兩者的完全支援。Swing提供菜單元件(即菜單條中的菜單和彈出式菜單中的菜單)和菜單項元件(包括複選框和單選按鈕菜單項)。
Swing還提供一個工具條元件,根據工具條的方向,工具條元件包含一行按鈕或一列按鈕。工具條通常提供對普通特性的簡單通路。通常,除鍵盤捷徑鍵提供對相同功能的通路外,菜單欄和工具條不提供對相同功能集的通路。工具條還可以是懸浮的,這樣,可以把工具條在視窗中任意拖動或拖到一個單獨的視窗中。
Swing菜單和菜單項是按鈕,因為JMenuItem擴充AbstractButton,JMenu擴充JMenuItem,如圖10-1所示。是以,Swing菜單和菜單項繼承了如下功能,即包含文本和(或)圖示、顯示光标進入時的圖示和助記符等。
圖10-1示出了JMenuItem和JMenu的父元件,它們最後都歸于java.awt.Container,以強調菜單和菜單項都是容器。可以把任何類型的元件(從包含一個動畫GIF的标簽到JTree的一個執行個體)添加到一個菜單或菜單項中。
菜單和菜單項還實作MenuElement接口,以便參與菜單事件的處理。MenuElement接口在10.7節“菜單元素”中介紹。
工具條和彈出式菜單都擴充JComponent類,即任意元件都可以添加到一個工具條或彈出式菜單中。
本章将介紹下面的元件:
·JMenuItem
·JCheckBoxMenuItem
·JRadioButtonMenuItem
·JMenu
·JPopupMenu
·JMenuBar
·JToolBar
10.1 菜單、菜單欄和工具條
例10-1 JRootPane中的菜單欄和工具條
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test extends JApplet {
Icon
dukeStanding = new ImageIcon("duke_standing.gif"),
dukeWaving = new ImageIcon("duke_waving.gif"),
dukeStandingSmall =
new ImageIcon("duke_standing_small.gif"),
dukeWavingSmall = new ImageIcon("duke_waving_small.gif");
public void init() {
Container contentPane = getContentPane();
Action[] actions = {
new NewAction(),
new OpenAction(),
new CutAction(),
new CopyAction(),
new PasteAction(),
new ExitAction()
};
JToolBar toolbar = new JToolBar();
JMenuBar menubar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JRadioButton
menubarDuke = new JRadioButton(dukeStandingSmall),
menuDuke = new JRadioButton(dukeStandingSmall),
toolbarDuke = new JRadioButton(dukeStanding);
menuDuke.setRolloverIcon(dukeWavingSmall);
menubarDuke.setRolloverIcon(dukeWavingSmall);
toolbarDuke.setRolloverIcon(dukeWaving);
menubar.add(menubarDuke);
toolbar.add(toolbarDuke);
fileMenu.add(menuDuke);
for(int i=0; i < actions.length; ++i) {
fileMenu.add(actions[i]);
if(i != actions.length-1)
toolbar.add(actions[i]);
if(i == 2 || i == actions.length-2){
toolbar.addSeparator();
fileMenu.addSeparator();
}
menubar.add(fileMenu);
contentPane.add(toolbar, BorderLayout.NORTH);
getRootPane().setJMenuBar(menubar);
System.out.println(contentPane.getClass().getName());
LayoutManager lm = contentPane.getLayout();
System.out.println(lm.getClass());
class NewAction extends AbstractAction {
public NewAction() {
super("New ...", new ImageIcon("new.gif"));
public void actionPerformed(ActionEvent event) {
showStatus("new");
class OpenAction extends AbstractAction {
public OpenAction() {
super("Open ...", new ImageIcon("open.gif"));
showStatus("open");
class CutAction extends AbstractAction {
public CutAction() {
super("Cut", new ImageIcon("cut.gif"));
showStatus("cut");
class CopyAction extends AbstractAction {
public CopyAction() {
super("Copy", new ImageIcon("copy.gif"));
showStatus("copy");
class PasteAction extends AbstractAction {
public PasteAction() {
super("Paste", new ImageIcon("paste.gif"));
showStatus("paste");
class ExitAction extends AbstractAction {
public ExitAction() {
super("Exit");
putValue(Action.SMALL_ICON, dukeWavingSmall);
System.exit(0);
10.2 菜單和彈出式菜單
例10-2 一個簡單的菜單舉例
JMenuBar mb = new JMenuBar();
JMenu pullRightMenu = new JMenu("pull right");
fileMenu.add("New ...");
fileMenu.add("Open ...");
fileMenu.add("Save");
fileMenu.add("Save As ..");
fileMenu.add(pullRightMenu);
fileMenu.add("Exit");
pullRightMenu.add(new JCheckBoxMenuItem("Bush"));
pullRightMenu.add(new JCheckBoxMenuItem("Tonic"));
pullRightMenu.add(new JCheckBoxMenuItem("Radio Head"));
pullRightMenu.add(new JCheckBoxMenuItem("Marcy Playground"));
pullRightMenu.add(new JCheckBoxMenuItem("Silver Chair"));
mb.add(fileMenu);
setJMenuBar(mb);
10.3 JMenuItem
例10-3 安裝一些菜單項
Icon newIcon = new ImageIcon("new.gif",
"Create a new document");
Icon openIcon = new ImageIcon("open.gif",
"Open an existing document");
JMenuItem newItem = new JMenuItem(newIcon);
JMenuItem openItem = new JMenuItem("Open ...", openIcon);
JMenuItem saveItem = new JMenuItem("Save");
JMenuItem saveAsItem = new JMenuItem("Save As ...");
JMenuItem exitItem = new JMenuItem("Exit", 'x');
fileMenu.add(newItem);
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(saveAsItem);
fileMenu.add(exitItem);
MenuItemListener listener = new MenuItemListener(this);
newItem.addActionListener(listener);
openItem.addActionListener(listener);
saveItem.addActionListener(listener);
saveAsItem.addActionListener(listener);
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
});
class MenuItemListener implements ActionListener {
private JApplet applet;
public MenuItemListener(JApplet applet) {
this.applet = applet;
JMenuItem item = (JMenuItem)e.getSource();
ImageIcon icon = (ImageIcon)item.getIcon();
if(icon != null)
System.out.println(icon.getDescription());
else
System.out.println(item.getText());
10.3.1菜單項快捷鍵助記符鍵
例10-4 帶助記符鍵和快捷鍵的菜單項
public class Test extends JFrame {
public Test() {
JMenuItem exitItem = new JMenuItem("Exit");
KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_X,
Event.ALT_MASK);
exitItem.setAccelerator(ks);
fileMenu.setMnemonic('F');
exitItem.setMnemonic(KeyEvent.VK_X);
public static void main(String args[]) {
GJApp.launch(new Test(),
"Accelerators and Mnemonics",300,300,450,300);
class GJApp extends WindowAdapter {
static private JPanel statusArea = new JPanel();
static private JLabel status = new JLabel(" ");
public static void launch(final JFrame f, String title,
final int x, final int y,
final int w, int h) {
f.setTitle(title);
f.setBounds(x,y,w,h);
f.setVisible(true);
statusArea.setBorder(BorderFactory.createEtchedBorder());
statusArea.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));
statusArea.add(status);
status.setHorizontalAlignment(JLabel.LEFT);
f.setDefaultCloseOperation(
WindowConstants.DISPOSE_ON_CLOSE);
f.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
static public JPanel getStatusArea() {
return statusArea;
static public void updateStatus(String s) {
status.setText(s);
10.3.2 JMenuItem屬性
10.3.3 JMenuItem事件
例10-5 監聽菜單項動作和菜單項變化事件
import javax.swing.event.*;
JMenuItem newItem = new JMenuItem("New ..."),
openItem = new JMenuItem("Open ..."),
saveItem = new JMenuItem("Save"),
saveAsItem = new JMenuItem("Save As ..."),
exitItem = new JMenuItem("Exit");
Listener listener = new Listener(this);
newItem.setActionCommand("Create a New Document");
openItem.setActionCommand("Open an Existing Document");
saveItem.setActionCommand("Save Document");
saveAsItem.setActionCommand("Save Document As ...");
exitItem.setActionCommand("Exit the applet");
newItem.addChangeListener(listener);
openItem.addChangeListener(listener);
saveItem.addChangeListener(listener);
saveAsItem.addChangeListener(listener);
exitItem.addChangeListener(listener);
class Listener implements ChangeListener {
public Listener(JApplet applet) {
public void stateChanged(ChangeEvent e) {
JMenuItem b = (JMenuItem)e.getSource();
if(b.isArmed())
applet.showStatus(b.getActionCommand());
10.3.4 JMenuItem類總結
10.3.5 AWT相容
10.4 JCheckBoxMenuItem
例10-6 執行個體化複選框菜單項
JMenu checkBoxMenu = new JMenu("Endangered Species");
ImageIcon crabIcon = new ImageIcon("crab.gif");
ImageIcon eagleIcon = new ImageIcon("eagle.gif");
JMenuItem
crabItem = new JCheckBoxMenuItem(crabIcon),
eagleItem = new JCheckBoxMenuItem("eagle",
eagleIcon, true),
ladybugItem = new JCheckBoxMenuItem("ladybug");
checkBoxMenu.add(crabItem);
checkBoxMenu.add(eagleItem);
checkBoxMenu.add(ladybugItem);
ladybugItem.setMnemonic('l');
mb.add(checkBoxMenu);
10.4.1 JCheckBoxMenuItem屬性
10.4.2 JCheckBoxMenuItem事件
例10-7 通路JCheckBoxMenuItem狀态
private ImageIcon crabIcon = new ImageIcon("crab.gif");
private ImageIcon eagleIcon = new ImageIcon("eagle.gif");
private JCheckBoxMenuItem
eagleItem = new JCheckBoxMenuItem("eagle", eagleIcon),
Listener listener = new Listener();
crabItem.addActionListener(listener);
eagleItem.addActionListener(listener);
ladybugItem.addActionListener(listener);
class Listener implements ActionListener {
showStatus("crab: " + crabItem.getState() + ", " +
"eagle: " + eagleItem.getState() + ", " +
"ladybug: " + ladybugItem.getState());
10.4.3 JCheckBoxMenuItem類總結
10.4.4 AWT相容
10.5 JRadioButtonMenuItem
例10-8 執行個體化單選按鈕菜單項
JMenu radioMenu = new JMenu("Favorite Animal");
final JMenuItem
crabItem = new JRadioButtonMenuItem(crabIcon),
eagleItem = new JRadioButtonMenuItem("eagle",
eagleIcon),
ladybugItem = new JRadioButtonMenuItem("ladybug");
radioMenu.add(crabItem);
radioMenu.add(eagleItem);
radioMenu.add(ladybugItem);
mb.add(radioMenu);
10.5.1 JRadioButtonMenuItem屬性
10.5.2 JRadioButtonMenuItem事件
例10-9 為JRadioButton的執行個體監視事件
private ImageIcon crabIcon = new ImageIcon("crab.gif",
"Crab");
private ImageIcon eagleIcon = new ImageIcon("eagle.gif",
"Eagle");
private JMenuItem
AnItemListener itemListener = new AnItemListener();
AnActionListener actionListener = new AnActionListener();
AChangeListener changeListener = new AChangeListener();
ButtonGroup group = new ButtonGroup();
group.add(crabItem);
group.add(eagleItem);
group.add(ladybugItem);
crabItem.addItemListener(itemListener);
eagleItem.addItemListener(itemListener);
ladybugItem.addItemListener(itemListener);
crabItem.addActionListener(actionListener);
eagleItem.addActionListener(actionListener);
ladybugItem.addActionListener(actionListener);
crabItem.addChangeListener(changeListener);
eagleItem.addChangeListener(changeListener);
ladybugItem.addChangeListener(changeListener);
private String getItemDescription(JMenuItem item) {
String s;
if(icon != null) return icon.getDescription();
else return item.getText();
// Inner class event handlers follow ...
class AnActionListener implements ActionListener {
JMenuItem item = (JMenuItem) e.getSource();
String s = getItemDescription(item);
showStatus(s + " activated");
System.out.println("action event fired");
class AChangeListener implements ChangeListener {
Object[] selectedObjs =
ladybugItem.getSelectedObjects();
if(selectedObjs == null)
System.out.println("selected objs is null");
System.out.println(selectedObjs[0] + "selected");
if(item.isArmed()) {
showStatus(s + " armed");
System.out.println("change event fired");
class AnItemListener implements ItemListener {
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED)
s += " selected";
s += " deselected";
showStatus(s);
System.out.println("item event fired");
10.5.3 JRadioButtonMenuItem類總結
10.5.4 AWT相容
10.6 JMenu
例10-10 JMenu的一個簡單例子
10.6.1動态修改菜單
例10-11 一個自修改菜單
import java.util.Vector;
private SelfModifyingMenu selfModifyingMenu;
JMenuBar menuBar = new JMenuBar();
createMenus(menuBar);
setJMenuBar(menuBar);
public void createMenus(JMenuBar mbar) {
mbar.add(createFileMenu());
mbar.add(selfModifyingMenu = new SelfModifyingMenu());
private JMenu createFileMenu() {
JMenuItem quitItem = new JMenuItem("Quit");
fileMenu.add(quitItem);
quitItem.addActionListener(new ActionListener() {
return fileMenu;
class SelfModifyingMenu extends JMenu {
private Vector newItems = new Vector();
private Listener menuItemListener = new Listener();
private JMenuItem toggleItem, enablerItem,
addItem, removeItem;
public SelfModifyingMenu() {
super("Self Modifying Menu");
add(enablerItem = new JMenuItem("Disable Item Below"));
add(toggleItem = new JMenuItem("Enable/Disable Me"));
addSeparator();
add(addItem = new JMenuItem("Add a JMenuItem ..."));
add(removeItem = new JMenuItem(
"Remove last JMenuItem ..."));
addItem.setFont(new Font("Helvetica", Font.BOLD, 18));
enablerItem.addActionListener(menuItemListener);
toggleItem.addActionListener(menuItemListener);
addItem.addActionListener(menuItemListener);
removeItem.addActionListener(menuItemListener);
public void addItem() {
JMenuItem newItem =
new JMenuItem("Extra Item #" + newItems.size());
add(newItem);
newItems.addElement(newItem);
public void removeLastItem() {
if(newItems.size() == 0)
System.out.println("Nothing to remove!");
else {
JMenuItem removeMe =
(JMenuItem)newItems.lastElement();
remove(removeMe);
newItems.removeElement(removeMe);
public void toggleItem() {
if(toggleItem.isEnabled()) toggleItem.setEnabled(false);
else toggleItem.setEnabled(true);
JMenuItem item = (JMenuItem)event.getSource();
if(item == enablerItem) {
toggleItem();
if(toggleItem.isEnabled())
enablerItem.setText("Disable Item Below");
enablerItem.setText("Enable Item Below");
else if(item == addItem) addItem();
else if(item == removeItem) removeLastItem();
10.6.2右拉式菜單
例10-12 右拉式菜單
mbar.add(createCascadingMenu());
private JMenu createCascadingMenu() {
JMenu cascading = new JMenu("Cascading", true);
JMenu submenu = new JMenu("pull right menu 1", true);
JMenu subsubmenu = new JMenu("pull right menu 2", true);
submenu.add("submenu item 1");
submenu.add("submenu item 2");
submenu.add("submenu item 3");
submenu.add("submenu item 4");
submenu.add("submenu item 5");
subsubmenu.add("subsubmenu item 1");
subsubmenu.add("subsubmenu item 2");
subsubmenu.add("subsubmenu item 3");
subsubmenu.add("subsubmenu item 4");
subsubmenu.add("subsubmenu item 5");
submenu.add(subsubmenu);
cascading.add(submenu);
return cascading;
10.6.3 JMenu屬性
10.6.4 JMenu事件
例10-13 監聽菜單事件
fileMenu.addMenuListener(new MenuListener() {
public void menuCanceled(MenuEvent e) {
System.out.println("menu canceled");
public void menuSelected(MenuEvent e) {
System.out.println("menu selected");
public void menuDeselected(MenuEvent e) {
System.out.println("menu deselected");
10.6.5 JMenu類總結
例10-14 顯示一個菜單條中菜單的資訊
final JMenuBar mb = new JMenuBar();
final MenuBarPrinter printer = new MenuBarPrinter();
JMenu editMenu = new JMenu("Edit");
editMenu.setMnemonic('F');
editMenu.add("Cut");
editMenu.add("Copy");
editMenu.add("Paste");
mb.add(editMenu);
JButton button = new JButton("show menu information");
contentPane.setLayout(new FlowLayout());
contentPane.add(button);
button.addActionListener(new ActionListener() {
printer.print(mb);
class MenuBarPrinter {
static public void print(JMenuBar menubar) {
int numMenus = menubar.getMenuCount();
JMenu nextMenu;
JMenuItem nextItem;
System.out.println();
System.out.println("MenuBar has " +
menubar.getMenuCount() +
" menus");
for(int i=0; i < numMenus; ++i) {
nextMenu = menubar.getMenu(i);
System.out.println(nextMenu.getText() + " menu ...");
System.out.println(nextMenu);
int numItems = nextMenu.getItemCount();
for(int j=0; j < numItems; ++j) {
nextItem = nextMenu.getItem(j);
System.out.println(nextItem);
10.6.6 AWT相容
10.7 菜單元素
例10-15 實作定制菜單元素
import java.util.*;
fileMenu.add(new UnderlineElement("item one"));
fileMenu.add(new UnderlineElement("item two"));
fileMenu.add(new UnderlineElement("item three"));
menuBar.add(fileMenu);
class UnderlineElement extends JButton implements MenuElement {
private boolean drawUnderline = false;
public UnderlineElement(String s) {
super(s);
setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
public Component getComponent() {
return this;
public MenuElement[] getSubElements() {
return new MenuElement[0];
public void menuSelectionChanged(boolean b) {
drawUnderline = b;
repaint();
public void paintComponent(Graphics g) {
super.paintComponent(g);
Insets insets = getInsets();
if(drawUnderline) {
FontMetrics fm = g.getFontMetrics();
g.drawLine(insets.left, insets.top + fm.getHeight(),
fm.stringWidth(getText()),
insets.top + fm.getHeight());
public void processKeyEvent(KeyEvent me,
MenuElement[] element,
MenuSelectionManager msm) {
public void processMouseEvent(MouseEvent me) {
super.processMouseEvent(me);
MenuSelectionManager.defaultManager().processMouseEvent(
me);
public void processMouseEvent(MouseEvent me,
if(me.getID() == MouseEvent.MOUSE_CLICKED ||
me.getID() == MouseEvent.MOUSE_RELEASED) {
msm.setSelectedPath(null);
doClick();
msm.setSelectedPath(getPath());
public MenuElement[] getPath() {
MenuSelectionManager defaultManager =
MenuSelectionManager.defaultManager();
MenuElement oldPath[] = defaultManager.getSelectedPath();
MenuElement newPath[];
int len = oldPath.length;
if(len > 0) {
MenuElement lastElement = oldPath[len-1];
Component parent = getParent();
if (lastElement == parent) {
newPath = new MenuElement[len+1];
System.arraycopy(oldPath, 0, newPath, 0, len);
newPath[len] = this;
int j;
for (j = len-1; j >= 0; j--) {
if (oldPath[j].getComponent() == parent)
break;
newPath = new MenuElement[j+2];
System.arraycopy(oldPath, 0, newPath, 0, j+1);
newPath[j+1] = this;
return newPath;
10.8 JPopupMenu
例10-16 使用彈出式菜單
final JLabel label = new JLabel("Click here for popup");
final JPopupMenu popup = new JPopupMenu();
final JSlider slider = new JSlider();
popup.add(new JMenuItem("Copy", new ImageIcon(this.getClass().getResource("copy.gif"))));
popup.add(new CutAction(new ImageIcon(this.getClass().getResource("cut.gif"))));
popup.addSeparator();
popup.add(slider);
label.addMouseListener(new MouseAdapter() {
public void mousePressed (MouseEvent e) {
popup.show(label, e.getX(), e.getY());
slider.addChangeListener(new ChangeListener() {
if( ! slider.getValueIsAdjusting())
popup.setVisible(false);
label.setHorizontalAlignment(JLabel.CENTER);
contentPane.add(label, BorderLayout.CENTER);
java.net.URL iconurl;
public CutAction(Icon icon) {
//super("Cut", new ImageIcon("cut.gif"));
super("Cut",icon);
System.out.println("cut");
10.8.1彈出式菜單觸發器
例10-17 顯示一個彈出式菜單以響應彈出式菜單觸發器
private JPopupMenu popup = new JPopupMenu();
popup.add(new JMenuItem("item one"));
popup.add(new JMenuItem("item two"));
popup.add(new JMenuItem("item three"));
popup.add(new JMenuItem("item four"));
contentPane.addMouseListener(new MouseAdapter() {
showPopup(e);
public void mouseClicked (MouseEvent e) {
public void mouseReleased(MouseEvent e) {
void showPopup(MouseEvent e) {
if(e.isPopupTrigger())
popup.show(this, e.getX(), e.getY());
10.8.2輕量/中量/重量彈出式菜單
10.8.3彈出式菜單調用者
例10-18 相對于其調用者顯示彈出式菜單
JComboBox combobox = new JComboBox();
JPopupMenu popup = new JPopupMenu();
ColoredCanvas popupRelativeToMe;
ColoredCanvas blueCanvas, redCanvas, yellowCanvas;
blueCanvas = new ColoredCanvas(Color.blue);
redCanvas = new ColoredCanvas(Color.red);
yellowCanvas = new ColoredCanvas(Color.yellow);
popupRelativeToMe = blueCanvas;
contentPane.add(new JLabel("Popup Over:"));
contentPane.add(combobox);
contentPane.add(blueCanvas);
contentPane.add(redCanvas);
contentPane.add(yellowCanvas);
combobox.addItem("Blue Canvas");
combobox.addItem("Yellow Canvas");
combobox.addItem("Red Canvas");
combobox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent event) {
if(event.getStateChange() == ItemEvent.SELECTED) {
JComboBox c = (JComboBox)event.getSource();
String label = (String)c.getSelectedItem();
if(label.equals("Blue Canvas"))
else if(label.equals("Red Canvas"))
popupRelativeToMe = redCanvas;
else if(label.equals("Yellow Canvas"))
popupRelativeToMe = yellowCanvas;
popup.show(popupRelativeToMe, 5, 5);
class ColoredCanvas extends JPanel {
private Color color;
public ColoredCanvas(Color color) {
this.color = color;
Dimension size = getSize();
g.setColor (color);
g.fill3DRect(0,0,size.width-1,size.height-1,true);
public Dimension getPreferredSize() {
return new Dimension(100,100);
10.8.4 JPopupMenu屬性
10.8.5 JPopupMenu事件
例10-19 彈出式菜單事件的清單
import java.beans.*;
final Container contentPane = getContentPane();
popup.addPopupMenuListener(new PopupMenuListener() {
public void popupMenuCanceled(PopupMenuEvent e) {
showStatus("menu canceled");
public void popupMenuWillBecomeVisible(
PopupMenuEvent e) {
showStatus("menu will become visible");
public void popupMenuWillBecomeInvisible(
showStatus("menu will become invisible");
addMouseListener(new MouseAdapter() {
popup.show(contentPane, e.getX(), e.getY());
10.8.6 JPopupMenu類總結
例10-20 為彈出式菜單設定位置、邊框和調用者
JLabel label = new JLabel("Click To Show Popup");
public void mousePressed(MouseEvent e) {
//if(e.isPopupTrigger()) {
popup.setVisible(true);
//}
10.8.7 AWT相容
10.9 JMenuBar
例10-21 一個簡單的菜單欄
final JMenu fileMenu = new JMenu("File");
mb.add(new JLabel(
new ImageIcon("smiley_face_small.gif")));
// Either one of the following two lines will
// attach the menu bar to the application
//setJMenuBar(mb);
getRootPane().setJMenuBar(mb);
dispose();
System.out.println("component count: " +
mb.getComponentCount());
System.out.println("first component: " +
(mb.getComponentAtIndex(0)).getClass().getName());
System.out.println("menu count: " + (mb.getMenuCount()));
JMenu menu = mb.getMenu(0);
if(menu == null) System.out.println("null menu");
else System.out.println("got menu");
"A Menu Bar",300,300,300,250);
static private ResourceBundle resources;
launch(f,title,x,y,w,h,null);
final int w, int h,
String propertiesFilename) {
if(propertiesFilename != null) {
resources = ResourceBundle.getBundle(
propertiesFilename, Locale.getDefault());
static public void showStatus(String s) {
static Object getResource(String key) {
if(resources != null) {
return resources.getString(key);
return null;
10.9.1菜單欄菜單群組件
例10-22 菜單欄中的菜單群組件
JButton compButton = new JButton(
"show menubar components ...");
JButton menuButton = new JButton(
"show menubar menus ...");
editMenu.add("Undo");
editMenu.addSeparator();
mb.setMargin(new Insets(30,20,10,5));
mb.add(new JLabel(new ImageIcon("smiley.gif")));
contentPane.add(compButton);
contentPane.add(menuButton);
menuButton.addActionListener(new ActionListener() {
Component c;
int cnt = mb.getMenuCount();
for(int i=0; i < cnt; ++i) {
c = mb.getMenu(i);
System.out.println(c);
compButton.addActionListener(new ActionListener() {
int cnt = mb.getComponentCount();
c = mb.getComponentAtIndex(i);
10.9.2 JMenuBar屬性
10.9.3 JMenuBar事件
10.9.4JMenuBar類總結
10.9.5 AWT相容
10.10 JToolBar
例10-23 把元件添加到一個菜單欄中
JToolBar tb = new JToolBar();
JComboBox fontCombo = new JComboBox(),
fontSizeCombo = new JComboBox();
JButton newButton = new JButton(new ImageIcon("new.gif")),
openButton = new JButton(new ImageIcon("open.gif")),
cutButton = new JButton(new ImageIcon("cut.gif")),
copyButton = new JButton(new ImageIcon("copy.gif")),
pasteButton = new JButton(new ImageIcon("paste.gif"));
fontCombo.addItem("Helvetica");
fontCombo.addItem("Palatino");
fontCombo.addItem("Courier");
fontCombo.addItem("Times");
fontCombo.addItem("Times-Roman");
fontSizeCombo.addItem("10");
fontSizeCombo.addItem("12");
fontSizeCombo.addItem("14");
fontSizeCombo.addItem("16");
fontSizeCombo.addItem("18");
tb.add(newButton);
tb.add(openButton);
tb.addSeparator();
tb.add(cutButton);
tb.add(copyButton);
tb.add(pasteButton);
tb.add(fontCombo);
tb.add(fontSizeCombo);
contentPane.setLayout(new BorderLayout());
contentPane.add(tb, BorderLayout.NORTH);
例10-24 把元件添加到一個工具條中(方法2)
newButton.setAlignmentY(0.5f);
openButton.setAlignmentY(0.5f);
cutButton.setAlignmentY(0.5f);
copyButton.setAlignmentY(0.5f);
pasteButton.setAlignmentY(0.5f);
newButton.setAlignmentX(0.5f);
openButton.setAlignmentX(0.5f);
cutButton.setAlignmentX(0.5f);
copyButton.setAlignmentX(0.5f);
pasteButton.setAlignmentX(0.5f);
fontCombo.setMaximumSize(fontCombo.getPreferredSize());
fontSizeCombo.setMaximumSize(
fontSizeCombo.getPreferredSize());
10.10.1滾過式工具條
例10-25 JTooBar.isRollover屬性
toolbar.add(new NewAction());
toolbar.add(new OpenAction());
toolbar.add(new CutAction());
toolbar.add(new CopyAction());
toolbar.add(new PasteAction());
toolbar.putClientProperty("JToolBar.isRollover",
Boolean.TRUE);
putValue(Action.SMALL_ICON,
new ImageIcon("new.gif"));
new ImageIcon("open.gif"));
putValue(Action.SMALL_ICON, new ImageIcon("cut.gif"));
new ImageIcon("copy.gif"));
new ImageIcon("paste.gif"));
10.10.2在工具條中使用動作
例10-26 把動作添加到一個工具條中
super("new", new ImageIcon("new.gif"));
super("cut", new ImageIcon("cut.gif"));
10.10.3浮動工具條
例10-27 固定位置的工具提示
String[] tooltipTexts = { "new", "open", "cut", "copy",
"paste"
ImageIcon[] icons = {
new ImageIcon("new.gif"),
new ImageIcon("open.gif"),
new ImageIcon("cut.gif"),
new ImageIcon("copy.gif"),
new ImageIcon("paste.gif")
JButton[] buttons = {
new ButtonWithFixedTooltip(icons[0],tooltipTexts[0]),
new ButtonWithFixedTooltip(icons[1],tooltipTexts[1]),
new ButtonWithFixedTooltip(icons[2],tooltipTexts[2]),
new ButtonWithFixedTooltip(icons[3],tooltipTexts[3]),
new ButtonWithFixedTooltip(icons[4],tooltipTexts[4])
for(int i=0; i < buttons.length; ++i) {
toolbar.add(buttons[i]);
if(tooltipTexts[i].equals("open"))
class ButtonWithFixedTooltip extends JButton {
public ButtonWithFixedTooltip(Icon icon, String tooltipText) {
super(icon);
setToolTipText(tooltipText);
public Point getToolTipLocation(MouseEvent e){
return new Point(0, size.height);
10.10.4位置固定的工具提示
略
10.10.5 JToolBar屬性
略
10.10.6 JMenuBar事件
10.10.7 JMenuBar類總結
10.10.8 AWT相容