使用Java編寫圖形化的菜單的教程
有兩種類型的菜單:下拉式菜單和彈出式菜單。本章只討論下拉式菜單編程方法。菜單與JComboBox和JCheckBox不同,它們?cè)诮缑嬷惺且恢笨梢姷?。菜單與JComboBox的相同之處是每次只可選擇一個(gè)項(xiàng)目。
在下拉式菜單或彈出式菜單中選擇一個(gè)選項(xiàng)就產(chǎn)生一個(gè)ActionEvent事件。該事件被發(fā)送給那個(gè)選項(xiàng)的監(jiān)視器,事件的意義由監(jiān)視器解釋。
菜單條、菜單和菜單項(xiàng)
下拉式菜單通過(guò)出現(xiàn)在菜單條上的名字可視化表示,菜單條(JMenuBar)通常出現(xiàn)在JFrame的頂部,一個(gè)菜單條顯示多個(gè)下拉式菜單的名字??梢杂脙煞N方式來(lái)激活下拉式菜單。一種是按下鼠標(biāo)的按鈕,并保持按下狀態(tài),移動(dòng)鼠標(biāo),直至釋放鼠標(biāo)完成選擇,高亮度顯示的菜單項(xiàng)即為所選擇的。另一種方式是當(dāng)光標(biāo)位于菜單條中的菜單名上時(shí),點(diǎn)擊鼠標(biāo),在這種情況下,菜單會(huì)展開,且高亮度顯示菜單項(xiàng)。
一個(gè)菜單條可以放多個(gè)菜單(JMenu),每個(gè)菜單又可以有許多菜單項(xiàng)(JMenuItem)。例如,Eclipse環(huán)境的菜單條有File、Edit、Source、Refactor等菜單,每個(gè)菜單又有許多菜單項(xiàng)。例如,F(xiàn)ile菜單有New、Open File、Close 、Close All等菜單項(xiàng)。
向窗口增設(shè)菜單的方法是:先創(chuàng)建一個(gè)菜單條對(duì)象,然后再創(chuàng)建若干菜單對(duì)象,把這些菜單對(duì)象放在菜單條里,再按要求為每個(gè)菜單對(duì)象添加菜單項(xiàng)。
菜單中的菜單項(xiàng)也可以是一個(gè)完整的菜單。由于菜單項(xiàng)又可以是另一個(gè)完整菜單,因此可以構(gòu)造一個(gè)層次狀菜單結(jié)構(gòu)。
1.菜單條
類JMenuBar的實(shí)例就是菜單條。例如,以下代碼創(chuàng)建菜單條對(duì)象menubar:
JMenuBar menubar = new JMenuBar();
在窗口中增設(shè)菜單條,必須使用JFrame類中的setJMenuBar()方法。例如,代碼:
setJMenuBar(menubar);
類JMenuBar的常用方法有:
- add(JMenu m):將菜單m加入到菜單條中。
- countJMenus():獲得菜單條中菜單條數(shù)。
- getJMenu(int p):取得菜單條中的菜單。
- remove(JMenu m):刪除菜單條中的菜單m。
2. 菜單
由類JMenu創(chuàng)建的對(duì)象就是菜單。類JMenu的常用方法如下:
- JMenu():建立一個(gè)空標(biāo)題的菜單。
- JMenu(String s):建立一個(gè)標(biāo)題為s的菜單。
- add(JMenuItem item):向菜單增加由參數(shù)item指定的菜單選項(xiàng)。
- add(JMenu menu):向菜單增加由參數(shù)menu指定的菜單。實(shí)現(xiàn)在菜單嵌入子菜單。
- addSeparator():在菜單選項(xiàng)之間畫一條分隔線。
- getItem(int n):得到指定索引處的菜單項(xiàng)。
- getItemCount():得到菜單項(xiàng)數(shù)目。
- insert(JMenuItem item,int n):在菜單的位置n插入菜單項(xiàng)item.
- remove(int n):刪除菜單位置n的菜單項(xiàng)
- removeAll():刪除菜單的所有菜單項(xiàng)。
3.菜單項(xiàng)
類JMenuItem 的實(shí)例就是菜單項(xiàng)。類JMenuItem的常用方法如下:
- JMenuItem():構(gòu)造無(wú)標(biāo)題的菜單項(xiàng)。
- JMenuItem(String s):構(gòu)造有標(biāo)題的菜單項(xiàng)。
- setEnabled(boolean b):設(shè)置當(dāng)前單項(xiàng)是否可被選擇。
- isEnabled():返回當(dāng)前菜單項(xiàng)是否可被用戶選擇。
- getLabel():得到菜單項(xiàng)的名稱。
- setLabel():設(shè)置菜單選項(xiàng)的名稱。
- addActionListener(ActionListener e):為菜單項(xiàng)設(shè)置監(jiān)視器。監(jiān)視器接受點(diǎn)擊某個(gè)菜單的動(dòng)作事件。
4. 處理菜單事件
菜單的事件源是用鼠標(biāo)點(diǎn)擊某個(gè)菜單項(xiàng)。處理該事件的接口是ActionListener,要實(shí)現(xiàn)的接口方法是actionPerformed(ActionEvent e),獲得事件源的方法getSource().
【例】小應(yīng)用程序示意窗口有菜單條的實(shí)現(xiàn)方法。設(shè)有一個(gè)按鈕,當(dāng)按鈕處于打開窗口狀態(tài)時(shí),單擊按鈕將打開一個(gè)窗口,窗口設(shè)有一個(gè)菜單條,有兩個(gè)菜單,每個(gè)菜單又各有三個(gè)菜單項(xiàng)。當(dāng)一個(gè)菜單項(xiàng)被選中時(shí),菜單項(xiàng)監(jiān)視方法在文本框中顯示相應(yīng)菜單項(xiàng)被選中字樣。
import java.applet.*
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class MenuWindow extends JFrame implements ActionListener{
public static JtextField text;
private void addItem(JMenu Menu,String menuName,ActionListener listener){
JMenuItem anItem = new JMenuItem(menuName);
anItem.setActionCommand(menuName);
anItem.addActionListener(listener);
Menu.add(anItem);
}
public MenuWindow(String s,int w,int h){
setTitle(s);
Container con = this.getContentPane();
con.setLayout(new BorderLayout());
this.setLocation(100,100);
this.setSize(w,h);
JMenu menu1 = new JMenu("體育");
addItem(menu1," 跑步",this);
addItem(menu1," 跳繩",this);
addItem(menu1,"打球",this);
JMenu menu2 = JMenu("娛樂(lè)");
addItem(menu2,"唱歌",this);
addItem(menu2,"跳舞",this);
addItem(menu2,"游戲",this);
JMenuBar menubar = new JMenuBar();
text = new JTextField();
menubar.add(menu1);
menubar.add(menu2);
setJMenuBar(MenuBar);
con.add(text,BorderLayout.NORTH);
}
public void actionPerformed(ActionEvent e){
text.setText(e.getActionCommand()+"菜單項(xiàng)被選中!");
}
}
public class Example6_5 extends Applet implements ActionListener{
MenuWindow window;
JButton button;
boolean bflg;
public void init(){
button = new JButton("打開我的體育娛樂(lè)之窗");bflg =true;
window = new MenuWindow("體育娛樂(lè)之窗",100,100);
button.addActionListener(this);
add(button);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==button){
if(bflg){
window.setVisible(true);
bflg = false;
button.setLabel("關(guān)閉我的體育娛樂(lè)之窗");
}
else{
window.setVisible(false);
bflg = true;
button.setLabel("打開我的體育娛樂(lè)之窗");
}
}
}
}
5. 嵌入子菜單
創(chuàng)建了一個(gè)菜單,并創(chuàng)建多個(gè)菜單項(xiàng),其中某個(gè)菜單項(xiàng)又是一個(gè)(含其他菜單項(xiàng)的)菜單,這就構(gòu)成菜單嵌套。例如,將上述程序中的有關(guān)代碼改成如下:
Menu menu1,menu2,item4; MenuItem item3,item5,item6,item41,item42;
另插入以下代碼創(chuàng)建item41和item42菜單項(xiàng),并把它們加入到item4菜單中:
item41= new MenuItem(“東方紅”); item42 = new MenuItem(“牡丹”); item4.add(item41); item4.add(item42);
則點(diǎn)擊item4菜單時(shí),又會(huì)打開兩個(gè)菜單項(xiàng)供選擇。
6. 向菜單增加退出項(xiàng)
增設(shè)一個(gè)新的菜單項(xiàng),對(duì)該菜單項(xiàng)加入監(jiān)視,對(duì)應(yīng)的監(jiān)視方法中使用System.exit()方法,就能實(shí)現(xiàn)單擊該菜單項(xiàng)時(shí)退出Java運(yùn)行環(huán)境。例如,以下示意代碼:
…
item7 = new MenuItem(“退出”);
item7.addActionListener(this);
…
public void actionPerformed(ActionEvent e){
if(e.getSource()==item7){
System.exit(0);
}
}
7.設(shè)置菜單項(xiàng)的快捷鍵
用MenuShortcut類為菜單項(xiàng)設(shè)置快捷鍵。構(gòu)造方法是MenuShortcut(int key)。其中key可以取值KeyEvent.VK_A至KenEvent.VK_Z,也可以取 ‘a(chǎn)'到 ‘z'鍵碼值。菜單項(xiàng)使用setShortcut(MenuShortcut k)方法來(lái)設(shè)置快捷鍵。例如,以下代碼設(shè)置字母e為快捷鍵。
class Herwindow extends Frame implements ActionListener{
MenuBar menbar;
Menu menu;
MenuItem item;
MenuShortcut shortcut = new MenuShortcut(KeyEvent.VK_E);
…
item.setShortcut(shortcut);
…
}
選擇框菜單項(xiàng)
菜單也可以包含具有持久的選擇狀態(tài)的選項(xiàng),這種特殊的菜單可由JCheckBoxMenuItem類來(lái)定義。JCheckBoxMenuItem對(duì)象像選擇框一樣,能表示一個(gè)選項(xiàng)被選中與否,也可以作為一個(gè)菜單項(xiàng)加到下拉菜單中。點(diǎn)擊JCheckBoxMenuItem菜單時(shí),就會(huì)在它的左邊出現(xiàn)打勾符號(hào)或清除打勾符號(hào)。例如,在例6.5程序的類MenuWindow中,將代碼
addItem(menu1,“跑步”,this);addItem(menu1,”跳繩”,this);
改寫成以下代碼,就將兩個(gè)普通菜單項(xiàng)“跑步“和“跳繩”改成兩個(gè)選擇框菜單項(xiàng):
JCheckBoxMenuItem item1 = new JCheckBoxMenuItem(“跑步”); JCheckBoxMenuItem item2 = new JCheckBoxMenuItem(“跳繩”); item1.setActionCommand(“跑步”); item1.addActionListener(this); menu1.add(item1); item2.setActionCommand(“跳繩”); item2.addActionListener(this); menu1.add(item2);
相關(guān)文章
Java求一個(gè)分?jǐn)?shù)數(shù)列的前20項(xiàng)之和的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java求一個(gè)分?jǐn)?shù)數(shù)列的前20項(xiàng)之和的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-02-02
你知道怎么用Spring的三級(jí)緩存解決循環(huán)依賴嗎
這篇文章主要為大家詳細(xì)介紹了Spring的三級(jí)緩存解決循環(huán)依賴,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
淺析Java Mail無(wú)法解析帶分號(hào)的收件人列表的問(wèn)題
JAVA MAIL嚴(yán)格按照RFC 822規(guī)范進(jìn)行操作,沒(méi)有對(duì)分號(hào)做處理。大多數(shù)郵件服務(wù)器都是嚴(yán)格遵循RFC 822規(guī)范的2013-08-08
Spring Boot Logging Level設(shè)置為off時(shí)的Bug
這篇文章主要介紹了Spring Boot Logging Level設(shè)置為off時(shí)的Bug,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring通過(guò)工具類實(shí)現(xiàn)獲取容器中的Bean
在實(shí)際開發(fā)中,我們往往要用到Spring容器為我們提供的諸多資源,例如想要獲取到容器中的配置、獲取到容器中的Bean等等。本文為大家詳細(xì)講講工具類如何獲取到Spring容器中的Bean,需要的可以參考一下2022-06-06
springboot使用線程池(ThreadPoolTaskExecutor)示例
大家好,本篇文章主要講的是springboot使用線程池(ThreadPoolTaskExecutor)示例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
SpringCloud Feign轉(zhuǎn)發(fā)請(qǐng)求頭(防止session失效)的解決方案
這篇文章主要介紹了SpringCloud Feign轉(zhuǎn)發(fā)請(qǐng)求頭(防止session失效)的解決方案,本文給大家分享兩種解決方案供大家參考,感興趣的朋友跟隨小編一起看看吧2020-10-10

