天天看點

《Java 2 圖形設計卷Ⅱ- SWING》第10章 菜單和工具條

第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相容