Swing菜單與工具欄(一) – JAVA編程語言程序開發技術文章

 


本書的前面兩章描述瞭一些低級的Swing組件。本章將會深入Swing面向菜單的組件。菜單與工具欄通過提供一些可視化的命令選項可以使得我們的程序更為友好。盡管Swing組件可以支持多個按鍵的命令序列,菜單被設計用來提供使用鼠標的圖形化選擇,而不是通過鍵盤。


本章將要討論的菜單組件的使用如下:



  • 對於級聯菜單,我們可以創建一個JMenu組件,並將其添加到JMenuBar。
  • 對於JMenu中的可選菜單,我們可以創建一個JMenuItem組件,並將其添加到JMenu。
  • 要創建子菜單,我們可以向JMenu添加一個新的JMenu,並向新菜單添加JMenuItem選項。
  • 然後,當一個JMenu被選中時,系統會在JPopupMenu中顯示其當前的組件集合。

除瞭基本的JMenuItem元素,本章將還會討論其他的菜單項目,例如JCheckBoxMenuItem以及JRadioButtonMenuItem,我們可以將這兩個菜單項目放在JMenu中。同時我們還會探討JSeparator類,他可以將菜單項目進行邏輯分組。我們將會瞭解如何通過使用JPopupMenu類來為JMenu被選中後出現的彈出菜單,或是任何組件的環境中提供支持。與抽象按鈕類似,每一個菜單元素也有一個用於鍵盤選中的熱鍵與其相關聯。我們同進也會瞭解鍵盤快捷鍵支持,從而可以使得用記避免在多級菜單間進行遍歷。


除瞭單個的菜單相關的組件之外,在本章中我們會瞭解JMenuBar選中模型以及菜單特定的事件相關類。我們要瞭解的選中模型接口是SingleSelectionModel接口,以及其默認實現DefaultSingleSelectionModel。我們將會探討菜單特定的監聽器以及事件MenuListener/MenuEvent,MenuKeyListener/MenuKeyEvent以及MenuDragMouseListener/MenuDragMouseEvent。另外,我們還會瞭解使用Popup與PopupFactory創建其他的彈出組件,以及通過JToolBar類使用工具欄。


6.1 使用菜單


我們先來瞭解一個演示菜單組件是如何組合在一起的示例。要開始我們的學習,創建一個具有菜單欄的窗體,如圖6-1所示。


swing_6_1


這個簡單的菜單示例具有下列特性:



  • 在菜單欄上是兩個普通的菜單:File與Edit。在File菜單下,是我們較為熟悉的New,Open,Close與Exit。在Edit菜單下則是Cut,Copy,Paste與Find以及一個Find選項的子菜單。選項子菜單將包含查找方向子菜單–向前與向後–以及一個大小寫敏感的開關。
  • 在不同菜單的各種位置,菜單分隔符將選項分邏輯集合。
  • 每一個菜單選項都具有一個相關聯的熱鍵,通過熱鍵可以進行鍵盤瀏覽與選中。熱鍵可以使得用戶通過鍵盤進行菜單選擇,例如,在Windows平臺下通過按下Alt-F可以打開File菜單。
  • 除瞭鍵盤熱鍵,與多個選項相關聯的擊鍵可以作為鍵盤快捷鍵。與熱鍵不同,快捷鍵可以直接激活一個菜單選項,甚至菜單選項並不可見時也是如此。
  • 選項子菜單具有一個與其相關聯的圖標。盡管在圖6-1中隻顯示瞭一個圖標,所有的菜單組件都可以具有一個圖標,除瞭JSpearator與JPopupMenu組件。

註意,對於這個示例,這些菜單選項並不會完成任何有意義的事情,僅是輸出哪一個菜單選項被選中。例如,由Edit菜單中選中Copy選項會顯示Selected: Copy。


列表6-1顯示瞭圖6-1中生成示例類的完整代碼。


 


/**
 *
 */
package net.ariel.ch06;   import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;   import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.KeyStroke;   /**
 * @author mylxiaoyi
 *
 */
public class MenuSample {   static class MenuActionListener implements ActionListener {
  public void actionPerformed(ActionEvent event ) {
   System.out.println(“Selected: “+event.getActionCommand());
  }
 }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Runnable runner = new Runnable() {
   public void run() {
    MenuActionListener menuListener = new MenuActionListener();
    JFrame frame  = new JFrame(“Menu Sample”);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   JMenuBar menuBar = new JMenuBar();   JMenu fileMenu = new JMenu(“File”);
    fileMenu.setMnemonic(KeyEvent.VK_F);
    menuBar.add(fileMenu);   JMenuItem newMenuItem = new JMenuItem(“New”, KeyEvent.VK_N);
    newMenuItem.addActionListener(menuListener);
    fileMenu.add(newMenuItem);   JMenuItem openMenuItem = new JMenuItem(“Open”, KeyEvent.VK_O);
    openMenuItem.addActionListener(menuListener);
    fileMenu.add(openMenuItem);   JMenuItem closeMenuItem = new JMenuItem(“Close”, KeyEvent.VK_C);
    closeMenuItem.addActionListener(menuListener);
    fileMenu.add(closeMenuItem);   fileMenu.addSeparator();   JMenuItem saveMenuItem = new JMenuItem(“Save”, KeyEvent.VK_S);
    saveMenuItem.addActionListener(menuListener);
    fileMenu.add(saveMenuItem);   fileMenu.addSeparator();   JMenuItem exitMenuItem = new JMenuItem(“Exit”, KeyEvent.VK_X);
    exitMenuItem.addActionListener(menuListener);
    fileMenu.add(exitMenuItem);   JMenu editMenu  = new JMenu(“Edit”);
    editMenu.setMnemonic(KeyEvent.VK_E);
    menuBar.add(editMenu);   JMenuItem cutMenuItem = new JMenuItem(“Cut”, KeyEvent.VK_T);
    cutMenuItem.addActionListener(menuListener);
    KeyStroke ctrlXKeyStroke = KeyStroke.getKeyStroke(“control X”);
    cutMenuItem.setAccelerator(ctrlXKeyStroke);
    editMenu.add(cutMenuItem);   JMenuItem copyMenuItem = new JMenuItem(“Copy”, KeyEvent.VK_C);
    copyMenuItem.addActionListener(menuListener);
    KeyStroke ctrlCKeyStroke = KeyStroke.getKeyStroke(“control C”);
    copyMenuItem.setAccelerator(ctrlCKeyStroke);
    editMenu.add(copyMenuItem);   JMenuItem pasteMenuItem = new JMenuItem(“Paste”, KeyEvent.VK_P);
    pasteMenuItem.addActionListener(menuListener);
    KeyStroke ctrlVKeyStroke = KeyStroke.getKeyStroke(“control V”);
    pasteMenuItem.setAccelerator(ctrlVKeyStroke);
    editMenu.add(pasteMenuItem);   editMenu.addSeparator();   JMenuItem findMenuItem = new JMenuItem(“Find”, KeyEvent.VK_F);
    findMenuItem.addActionListener(menuListener);
    KeyStroke f3KeyStroke = KeyStroke.getKeyStroke(“F3”);
    findMenuItem.setAccelerator(f3KeyStroke);
    editMenu.add(findMenuItem);   JMenu findOptionsMenu = new JMenu(“Options”);
    Icon atIcon = new ImageIcon(“at.gif”);
    findOptionsMenu.setIcon(atIcon);
    findOptionsMenu.setMnemonic(KeyEvent.VK_O);   ButtonGroup directionGroup = new ButtonGroup();   JRadioButtonMenuItem forwardMenuItem = new JRadioButtonMenuItem(“Forward”, true);
    forwardMenuItem.addActionListener(menuListener);
    forwardMenuItem.setMnemonic(KeyEvent.VK_F);
  &nbsp

發佈留言