菜单和工具条有密切的关系,因为通常它们都提供对大多数相同功能的访问。因此,一个或多个动作可以被多个菜单条和工具条所共享。
//JMenuBar、JMenu、JToolBar
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("file");
menu.add("new");
menuBar.add(menu);
f.setJMenuBar(menuBar);
当激活Swing菜单上的按钮时,则显示一个弹出式菜单。如果一个菜单在菜单栏中,它就称作顶层菜单,而包含在一个菜单中的多个菜单称作右拉式菜单。
//JMenuBar、JMenu、JToolBar
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("file");
menu.add("new");
JMenu other = new JMenu("other");
other.add("new1");
other.add("exit2");
menuBar.add(menu);
f.setJMenuBar(menuBar);
菜单项是按钮,因为JMenuItem扩展AbstractButton,因此,菜单项可以显示文本和图标。菜单项还继承了在它们激活时激发动作事件的能力。因为AbstractButton最终扩展java. awt . Container,所以菜单项还可以包含任意类型的AWT组件和Swing组件。
可以为菜单项指定一个快捷键,这个快捷键由KeyStroke 的一个实例表示。快捷键与助记符键类似,因为它们都代表键盘捷径方法,用来激活与一个菜单项相关联的一个动作。然而,助记符键要与由组件的界面样式定义的Meta键一起按下。例如,小应用程序为Exit菜单项指定了一个“x”助记符键。在Windows界面样式中,助记符键必须与Alt键一起按下来激活这个菜单项。相反,快捷键由KeyStroke的一个实例指定,这个实例指定准确的键组合,按下这个组合键才能激活菜单项。
快捷键是这样指定的,首先从static KeyStroke. getKeyStroke方法中获得对一个KeyStroke实例的引用,然后,把这个键击传送给JMenultem.setAccelerator方法。
通过使用AbstractButton . setMnemonics方法来指定助记符键。为说明起见,我们调用以一个字符为参数的 AbstractButton . setMnemonic ( char)来指定File菜单的助记符键,而用AbstractBut-ton . setMnemonic ( int)来指定Exit菜单项的助记符键。通常,用KeyEvent类中的 integer值来指定助记符键比用一个字符来指定助记符键要好,因为使用KeyEvent类中的一个常量确保了助记符键在国际化的小应用程序和应用程序中都能工作正常。
KeyStroke ks = keyStroke.getKeyStroke(KeyEvent.VK_X,Event.ALT_MASK);
item.setAccelerator(ks);
menu.setMnemonic(KeyEvent.VK_X);
只有快捷键属性
与所有的Swing按钮一样,激活菜单项时将激发动作事件,当修改它们的关联属性时将激发属性变化事件,在它们的状态改变时将激发变化事件。另外,当菜单项选取或取消选取时,这些菜单项会激发菜单项事件。
当鼠标拖动到一个菜单项上时,菜单项还激发MenuDragMouseEvents,在一个菜单项处于待命状态时,按下、释放、输入一个键都将使菜单项激发MenuKeyEvents事件。
**菜单变化事件:**小应用程序监听由 Exit菜单项激发的动作事件并通过退出这个小应用程序来进行响应。这个小应用程序还监听每个菜单项的变化事件,而且在一个菜单项处于待命状态时显示与此菜单项相关联的动作命令。一个菜单项处于待命状态是指这个菜单项已选取但没有激活。
**菜单的拖动鼠标事件:**在一个菜单元素上拖动鼠标光标时,则把MenuDragMouseEvent 的实例发送给已向菜单项登记了的、处于监听状态中的MenuDragMouseListener。
快捷键和助记符键都代表键盘捷径方法,因此,有必要指出它们之间的差别。
助记符键要与特定界面样式的“Meta”键一起使用。助记符键只有一个字符,如“x”,但是“x”必须与“Meta”键一起按下。例如,在Windows界面样式中,“Meta”键是Alt键,因此,指定为“x”的助记符键必须与Alt键一起按下,才能激活与之相关联的组件。
快捷键也是一种键盘捷径键,然而,特定界面样式的“Meta”键与快捷键无关。助记符键是一个字符或一个整数值,而快捷键是由KeyStroke的一个实例指定的,这个实例指定用来激活与之相关联的组件的完整的键组合。
最后,助记符键用于激活莱单,而快捷键不激活菜单;快捷键只调用与一个莱单项相关联的动作而不显示菜单。
JCheckBoxMenultem是JMenultem的一个简单扩展,它绘制一个复选框控制,缺省时,这个复选框在菜单项文本的左边。
源于JCheckBoxMenultem 的唯一的属性是state属性,它指示是否选取了个复选框菜单项。提供了获取和设置state属性的一些方法。
与所有的Swing 按钮一样,激活复选框菜单项时将激发动作事件,当修改它们的关联属性时将激发属性改变事件,当它们的状态改变时,将激发变化事件。
Swing单选钮菜单项与复选框菜单项相似,它们都是JMenultem的简单扩展。
Swing复选框菜单项与单选钮项的差别:
首先,虽然单选钮菜单项可以选取或取消选取,但是JRadioButtonMenultem类没有提供获得和设置这种菜单项的选取状态的方法。换句话说,JRadioButtonMenultem没有像JCheckBoxMenultem那样提供setState方法和getState方法。setState方法和getState方法被JCheckBoxMenultem实现以便维护与AWT的CheckboxMenultem类的兼容。因为AWT没有提供与Swing的JRadioButtonMenultem类似的组件,所以不需要这些方法来维护与AWT的兼容。
其次,与JCheckBoxMenultem不同,getSelectedObjects方法不能被JRadioButtonMenultem类重载。因此,为JRadioButtonMenultem的实例调用getSelectedObjects将导致对AbstractButton. getSelectedObjects ( )的调用,AbstractButton . getSelectedObjects方法将返回null。
没有新属性
与所有的Swing 按钮–样,激活单选钮菜单项时将激发动作事件,在修改它们的相关属性时将激发属性变化事件,在它们的状态变化时将激发变化事件。
Swing菜单本质上是按钮,它有与之相关联的弹出式菜单。当激活一个菜单时,它的弹出式菜单在这个菜单的下面显示。
JMenu提供了许多方法来添加菜单/插入菜单/删除菜单中的菜单项/进入菜单/退出菜单。添加或插人动作或菜单项的方法返回对最后添加或插入的菜单项的一个引用。添加或插人一个字符串的方法不返回对菜单项的一个引用;然而,把一个字符串添加到一个菜单中将导致菜单项的创建,这个菜单项将添加到这个菜单中。
JMenu扩展JMenultem,因此,用Swing来实现右拉式菜单是很容易的。
在选取、取消选取或取消JMenu的实例时将激发菜单事件。点击菜单的弹出式菜单以外的区域,可以取消一个菜单。为了监听菜单选取事件,在 swing.event包中定义了一个监听器接口。
菜单不支持快捷键,只支持助记符
JMenultem、JMenu、JPopupMenu和JMenuBar都实现MenuElement 接口,以便参与菜单事件处理。虽然菜单和菜单项实现MenuElement 接口,但是不需要理解这个接口,也不需要理解JMenultem和JMenu是如何为每天使用的Swing 菜单和菜单项实现这个接口的方法。
菜单是按钮,当鼠标指针进入菜单时,它显示一个弹出式菜单。弹出式菜单(由JPopupMenu类代表)除用于菜单外,还有别的用途,即一个弹出式菜单可以在一个组件内的任何地方显示,也可以在相对于屏幕的任何地方显示。
可以把动作、菜单项、组件和分隔线添加到一个Swing弹出式菜单中。当把一个动作添加到一个弹出式菜单中时,这个弹出式菜单将创建一个菜单项,并把它添加到这个弹出式菜单中。
虽然有时需要显示一个弹出式菜单以响应鼠标按下事件,但是,通常显示弹出式菜单是为了响应称作弹出式菜单触发器的事件序列。弹出式菜单触发器与窗口系统有关;例如,下面介绍了Motif 和 Windows 的弹出式菜单触发器:
Motif 弹出式菜单触发器:当鼠标按钮3按下时,如果这个鼠标按钮被按住或在短时间内释放的话,显示弹出式菜单并保持显示状态。此后,在弹出式菜单外或在弹出式菜单的一个菜单项内再按下鼠标使弹出式菜单消失。
Windows弹出式菜单触发器:在鼠标按钮⒉按下时显示弹出式菜单。此后,在弹出式菜单外或在弹出式菜单的一个菜单项内再单击鼠标按钮Ⅰ或鼠标按钮⒉使弹出式菜单消失。
Swing弹出式菜单只用一个类(JPopupmenu)来表示,但实际上有三种不同的弹出式菜单
类型 | 把弹出式菜单显示在什么什么中 |
---|---|
轻量 | 一个轻量容器 |
中量 | 一个重量AWT面板 |
重量 | 一个JWindow实例 |
弹出式菜单有一个与之相关联的组件,这个组件称作弹出式菜单的调用者。弹出式菜单的显示位置通常是相对于它们的调用者的,而且为了许多其他的事情,JPopuoMenu内部还使用调用者,例如,用调用者来定位弹出式菜单所在的窗口,以确定是否需要把弹出式菜单包含在它自己的一个窗口中。
borderPainted:确定是否绘制弹出式菜单的边框。
componentAtIndex、componentIndex:通过componentAtIndex 和 componentIndex属性,弹出式菜单可以分别提供已知索引值的组件和已知组件的索引值。两种设置方法都使用JPopupMenu从java.awt . Container继承的 getComponents方法来获得组件数组,这些组件包含在弹出式菜单中。
如果componentAtIndex 以一个无效的索引为参数,则从这个方法中返回一个null 引用。如果getComponentIndex 以一个不包含在弹出式菜单中的组件为参数,则这个方法返回-1。
invoker:通常通过使用JPopupMenu.show (Component invoker,int x,int y)把弹出式菜单显示在相对于它们的调用者组件的坐标上,show方法在调用者坐标系统中显示弹出式菜单。
使用JPopupMenu. setLocation ( int x,int y)方法,还可以把弹出式菜单显示在相对于屏幕的坐标上,其中的x、y是屏幕坐标。调用JPopupMenu . setVisible ()而不是JPopupMenu.show ()也可以使弹出式菜单显示在相对于屏幕的坐标上。然而,所有的弹出式菜单必须有一个非null的调用者,因此,用setLocation ()定位和用setVisible ()显示的的弹出式菜单必须用JPopup-Menu . setInvoker方法来显式地指定一个调用者。
label:弹出式菜单的标签用作菜单的标题。显示弹出式菜单的标题由弹出式菜单的界面样式负责。在Swing 1.2 FCS中,界面样式都不显示弹出式菜单标题。
lightWeightPopupEnabled:完全包含在一个窗口中的弹出式菜单可以在轻量容器或重量容器中显示。如果一个弹出式菜单的 lightWeightPopupEnabled属性是true,则使用轻量容器,如果这个属性是false,则这个弹出式菜单将包含在一个AWT面板中。
margin:margin属性代表从弹出式菜单的内容的内边沿到包含弹出式菜单的组件的外边框之间的边衬。
popupSize:JPopupMenu类提供了一个设置方法来设置弹出式菜单的大小,但没有提供获取方法。
rootPopupMenu:rootPopupMenu属性是一个计算属性,它返回JPopupMenu的最顶层父组件。
selectionMode:JPopupMenu类的选取模型是SingleSelectionModel类型。缺省时,弹出式
JPopupMenu 的实例激发两种类型的事件:PropertyChangeEvents 和 PopupMenuEvents。当与弹出式菜单相关联的关联属性修改时(与所有Swing组件的情况相同),将激发PropertyChangeEvents。例如,当一个弹出式菜单的可见性修改时,这个弹出式菜单将激发一个属性变化事件。
当弹出式菜单将变成可见或不可见时,或当弹出式菜单取消时,将激发PopupMenuEvents。在弹出式菜单可见的时,接着点击这个菜单外面的区域会使这个菜单不可见(即没有从弹出式菜单中选取菜单项),弹出式菜单就取消了。
菜单栏是包含一行菜单的容器。Swing菜单栏可以包含在小应用程序和应用程序中,而AWT菜单栏只能在应用程序中使用。
JMenuBar API提供了访问包含在菜单栏中的菜单和组件的方法。
JMenuBar的有些访问方法显示包含在菜单栏中的组件和菜单的信息。
borderPainted—确定是否绘制菜单栏的边框;缺省时,绘制边框。borderPainted属性可能被有些界面样式所忽略。
componentAtIndex—一·个计算属性,它返回给定索引的–个组件。添加到菜单栏的第–个组件的索引为0,添加到菜单栏中的最后一个组件的索引值是getComponentCount () -1。
我们知道,任何类型的组件都可以被添加到一个菜单栏中,因为Swing轻量组件都是AWT容器。因此,不能假定从getComponentAtIndex ()返回的组件是–个菜单。
componentIndex–—返回包含在一个菜单栏中的给定组件的索引值。添加到菜单栏的第一个组件的索引为0,添加到菜单栏中的最后一个组件的索引值是getComponentCount () -l。
helpMenu—一个帮助菜单,在菜单栏中它的代表是与界面样式有关。在Swing 1.1 FCS中,没有实现帮助菜单,换句话说,在 Swing 1.1 FCS下设置help Menu属性是没有效果的。
menuCount——一menuCount属性不像期望的那样代表菜单栏中的菜单数。这个属性代表菜单栏中所包含的组件数。
selectionModel——缺省情况下,菜单栏有一个DefaultSingleSelectionModel属性,该属性维护菜单栏中当前选取的菜单元素。
当今的用户界面没有不使用工具条的。在Swing中,工具条最终会成为JDK的一部分。Swing工具条由JToolBar类来表示,该类本质上是一个具有水平或垂直方向的容器。Swing工具条可以浮动,可以把它们拖到一个容器的北边、南边、东边或西边,或拖到一个单独的窗口中。除通过调用JToolBar add (Action)和addSeparator方法把动作和分隔线添加到工具条中外,还可以把任何类型的组件添加到工具条中。与菜单栏不同,在Swing 顶层容器(如JApplet和JRootPane)中没有添加工具条的特定方法。除应该用BorderLayout 的一个实例把工具条添加到一个容器中作为容器中的北边、南边或西边的组件外,把工具条添加到容器中的方式与添加任何Swing组件的方式相同。
有些界面样式对isRollover 工具条客户属性是敏感的。把工具条的这个属性设置为true可能导致只有当光标进入按钮上时才显示工具条按钮的边框。
与菜单一样,可以把动作添加到工具条中。JToolBar . add (Action)方法提取与动作相关联的图标和文本,并创建一个适当的按钮。
swing工具条可以浮动的
通常把与工具条按钮相关联的工具提示显示在相对于这个按钮的固定位置上。通常,把工具提示直接显示在这个按钮下面。
borderPainted—一确定是否要绘制工具条的边框。
componentIndex—一代表工具条中指定组件的索引。如果该组件没有包含在工具条中,则从getComponentIndex 方法返回-1。
componentAtIndex—一代表工具条中的特定位置上的一个组件。如果传送给getComponen-tAtIndex 方法的索引是无效的,则该方法返回一个null索引。
当确定传送给getComponentAtIndex方法的索引时,必须把分隔线考虑进去。例如,假如一个工具条包含一个组件后跟一个分隔线和另一个组件,如果要获得对工具条第二个组件的–个用,则索引值是2。
floatable——代表是否可以把一个工具条拖动到一个窗口的新位置上或把它拖动到它自己的–个窗口中。
orientation—–可以把工具条水平放置或垂直放置,Orientation属性是JTool-Br. HORZONTAL或JToolBar . VERTICAL。如果传送这两个常量以外的数值,则JTool-Bar . setOrientation方法将弹出一个异常信息指出参数是非法参数。
margin—代表工:具条边框的内边缘与工具条组件的外边缘之间的边距。如果该边距设置为null(这是缺省值),则工具条使用缺省边距(o,o,0,0)。
如果边距设置为非 null的边衬,则工具条的缺省边框使用这个边距值来产生工具条边框和它的组件之间的间隙。如果为工具条显式地设置了边框,则该边框负责把工具条的边距考虑进
只有属性变化事件