热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

使用Java编写图形化的菜单的教程

这篇文章主要介绍了使用Java编写图形化的菜单的教程,需要的朋友可以参考下

有两种类型的菜单:下拉式菜单和弹出式菜单。本章只讨论下拉式菜单编程方法。菜单与JComboBox和JCheckBox不同,它们在界面中是一直可见的。菜单与JComboBox的相同之处是每次只可选择一个项目。

在下拉式菜单或弹出式菜单中选择一个选项就产生一个ActionEvent事件。该事件被发送给那个选项的监视器,事件的意义由监视器解释。
菜单条、菜单和菜单项

下拉式菜单通过出现在菜单条上的名字可视化表示,菜单条(JMenuBar)通常出现在JFrame的顶部,一个菜单条显示多个下拉式菜单的名字。可以用两种方式来激活下拉式菜单。一种是按下鼠标的按钮,并保持按下状态,移动鼠标,直至释放鼠标完成选择,高亮度显示的菜单项即为所选择的。另一种方式是当光标位于菜单条中的菜单名上时,点击鼠标,在这种情况下,菜单会展开,且高亮度显示菜单项。

一个菜单条可以放多个菜单(JMenu),每个菜单又可以有许多菜单项(JMenuItem)。例如,Eclipse环境的菜单条有File、Edit、Source、Refactor等菜单,每个菜单又有许多菜单项。例如,File菜单有New、Open File、Close 、Close All等菜单项。

向窗口增设菜单的方法是:先创建一个菜单条对象,然后再创建若干菜单对象,把这些菜单对象放在菜单条里,再按要求为每个菜单对象添加菜单项。
菜单中的菜单项也可以是一个完整的菜单。由于菜单项又可以是另一个完整菜单,因此可以构造一个层次状菜单结构。

1.菜单条
类JMenuBar的实例就是菜单条。例如,以下代码创建菜单条对象menubar:

  JMenuBar menubar = new JMenuBar();


在窗口中增设菜单条,必须使用JFrame类中的setJMenuBar()方法。例如,代码:

  setJMenuBar(menubar);

类JMenuBar的常用方法有:

  • add(JMenu m):将菜单m加入到菜单条中。
  • countJMenus():获得菜单条中菜单条数。
  • getJMenu(int p):取得菜单条中的菜单。
  • remove(JMenu m):删除菜单条中的菜单m。

2. 菜单
由类JMenu创建的对象就是菜单。类JMenu的常用方法如下:

  • JMenu():建立一个空标题的菜单。
  • JMenu(String s):建立一个标题为s的菜单。
  • add(JMenuItem item):向菜单增加由参数item指定的菜单选项。
  • add(JMenu menu):向菜单增加由参数menu指定的菜单。实现在菜单嵌入子菜单。
  • addSeparator():在菜单选项之间画一条分隔线。
  • getItem(int n):得到指定索引处的菜单项。
  • getItemCount():得到菜单项数目。
  • insert(JMenuItem item,int n):在菜单的位置n插入菜单项item.
  • remove(int n):删除菜单位置n的菜单项
  • removeAll():删除菜单的所有菜单项。

3.菜单项
类JMenuItem 的实例就是菜单项。类JMenuItem的常用方法如下:

  • JMenuItem():构造无标题的菜单项。
  • JMenuItem(String s):构造有标题的菜单项。
  • setEnabled(boolean b):设置当前单项是否可被选择。
  • isEnabled():返回当前菜单项是否可被用户选择。
  • getLabel():得到菜单项的名称。
  • setLabel():设置菜单选项的名称。
  • addActionListener(ActionListener e):为菜单项设置监视器。监视器接受点击某个菜单的动作事件。

4. 处理菜单事件
菜单的事件源是用鼠标点击某个菜单项。处理该事件的接口是ActionListener,要实现的接口方法是actionPerformed(ActionEvent e),获得事件源的方法getSource().

【例】小应用程序示意窗口有菜单条的实现方法。设有一个按钮,当按钮处于打开窗口状态时,单击按钮将打开一个窗口,窗口设有一个菜单条,有两个菜单,每个菜单又各有三个菜单项。当一个菜单项被选中时,菜单项监视方法在文本框中显示相应菜单项被选中字样。

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("娱乐");
    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()+"菜单项被选中!");
  }
}
public class Example6_5 extends Applet implements ActionListener{
  MenuWindow window;
  JButton button;
  boolean bflg;
  public void init(){
    button = new JButton("打开我的体育娱乐之窗");bflg =true;
    window = new MenuWindow("体育娱乐之窗",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("关闭我的体育娱乐之窗");
      }
      else{
        window.setVisible(false);
        bflg = true;
        button.setLabel("打开我的体育娱乐之窗");
      }
    }
  }
}

5. 嵌入子菜单
创建了一个菜单,并创建多个菜单项,其中某个菜单项又是一个(含其他菜单项的)菜单,这就构成菜单嵌套。例如,将上述程序中的有关代码改成如下:

  Menu menu1,menu2,item4;
  MenuItem item3,item5,item6,item41,item42;


另插入以下代码创建item41和item42菜单项,并把它们加入到item4菜单中:

  item41= new MenuItem(“东方红”);
  item42 = new MenuItem(“牡丹”);
  item4.add(item41);
  item4.add(item42);


则点击item4菜单时,又会打开两个菜单项供选择。

6. 向菜单增加退出项
增设一个新的菜单项,对该菜单项加入监视,对应的监视方法中使用System.exit()方法,就能实现单击该菜单项时退出Java运行环境。例如,以下示意代码:

…

item7 = new MenuItem(“退出”);
item7.addActionListener(this);
…
public void actionPerformed(ActionEvent e){
if(e.getSource()==item7){
System.exit(0);
}
}


7.设置菜单项的快捷键
用MenuShortcut类为菜单项设置快捷键。构造方法是MenuShortcut(int key)。其中key可以取值KeyEvent.VK_A至KenEvent.VK_Z,也可以取 ‘a'到 ‘z'键码值。菜单项使用setShortcut(MenuShortcut k)方法来设置快捷键。例如,以下代码设置字母e为快捷键。

class Herwindow extends Frame implements ActionListener{
  MenuBar menbar;
  Menu menu;
  MenuItem item;
  MenuShortcut shortcut = new MenuShortcut(KeyEvent.VK_E);
  …
  item.setShortcut(shortcut);
  …
}

选择框菜单项

菜单也可以包含具有持久的选择状态的选项,这种特殊的菜单可由JCheckBoxMenuItem类来定义。JCheckBoxMenuItem对象像选择框一样,能表示一个选项被选中与否,也可以作为一个菜单项加到下拉菜单中。点击JCheckBoxMenuItem菜单时,就会在它的左边出现打勾符号或清除打勾符号。例如,在例6.5程序的类MenuWindow中,将代码

  addItem(menu1,“跑步”,this);addItem(menu1,”跳绳”,this);


改写成以下代码,就将两个普通菜单项“跑步“和“跳绳”改成两个选择框菜单项:

  JCheckBoxMenuItem item1 = new JCheckBoxMenuItem(“跑步”);
  JCheckBoxMenuItem item2 = new JCheckBoxMenuItem(“跳绳”);
  item1.setActionCommand(“跑步”);
  item1.addActionListener(this);
  menu1.add(item1);
  item2.setActionCommand(“跳绳”);
  item2.addActionListener(this);
  menu1.add(item2);


推荐阅读
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • 本文详细介绍了如何在Python3环境中配置Appium1.4.6,并指导如何连接模拟器进行自动化测试。通过本文,您将了解从环境搭建到模拟器连接的完整流程。 ... [详细]
  • Eclipse 中 JSP 开发环境配置指南
    本文详细介绍了如何在 Eclipse 集成开发环境中配置 JSP 运行环境,包括必要的软件下载、Tomcat 服务器的配置以及常见问题的解决方法。 ... [详细]
  • 初探Java编程:从入门到实践
    本文旨在为初学者提供Java编程的基础知识,涵盖程序、算法、流程图的概念,以及JDK环境的配置和Eclipse的使用方法。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 本文旨在详细介绍如何在PL/SQL环境中调试Oracle数据库中的触发器。虽然触发器能够实现某些复杂的功能,但其使用可能增加系统的维护难度。因此,本文不仅提供技术指导,还讨论了触发器使用的利弊。 ... [详细]
  • 本文详细介绍如何在IntelliJ IDEA 14中打包Android应用APK文件,并提供查询SHA1值的具体步骤。 ... [详细]
  • 本文介绍了Java语言开发的远程教学系统,包括源代码、MySQL数据库配置以及相关文档,适用于计算机专业的毕业设计。系统支持远程调试,采用B/S架构,适合现代教育需求。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • Java EE CDI:解决依赖关系冲突的实例
    在本教程中,我们将探讨如何在Java EE的CDI(上下文和依赖注入)框架中有效解决依赖关系的冲突问题。通过学习如何使用限定符,您将能够为应用程序的不同客户端提供多种接口实现,并确保每个客户端都能正确调用其所需的实现。 ... [详细]
  • 本文详细介绍了如何通过MyEclipse将Java工程项目导出为JAR文件,包括选择项目、配置JAR文件设置以及完成导出的具体步骤。 ... [详细]
author-avatar
mobiledu2502895753
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有