按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
{ 〃Cut〃; mi; new Character('t'); a1; bT };
{ 〃Copy〃; mi; new Character('C'); a1; bT };
{ 〃Paste〃; mi; new Character('P'); a1; bT };
{ null }; // Separator
{ 〃Select All〃; mi;new Character('l');a1;bT};
};
public Object'''' helpMenu = {
// Menu name:
{ 〃Help〃; new Character('H') };
// Name type accel listener enabled
{ 〃Index〃; mi; new Character('I'); a1; bT };
{ 〃Using help〃; mi;new Character('U');a1;bT};
{ null }; // Separator
{ 〃About〃; mi; new Character('t'); a1; bT };
};
public Object'''' optionMenu = {
// Menu name:
{ 〃Options〃; new Character('O') };
// Name type accel listener enabled
{ 〃Option 1〃; cb; new Character('1'); a1;bT};
{ 〃Option 2〃; cb; new Character('2'); a1;bT};
};
public Object'''' faceMenu = {
// Menu name:
{ 〃Faces〃; new Character('a') };
// Optinal last element is icon
{ 〃Face 0〃; rb; new Character('0'); a2; bT;
Faces。faces'0' };
475
…………………………………………………………Page 477……………………………………………………………
{ 〃Face 1〃; rb; new Character('1'); a2; bT;
Faces。faces'1' };
{ 〃Face 2〃; rb; new Character('2'); a2; bT;
Faces。faces'2' };
{ 〃Face 3〃; rb; new Character('3'); a2; bT;
Faces。faces'3' };
{ 〃Face 4〃; rb; new Character('4'); a2; bT;
Faces。faces'4' };
};
public Object'' menuBar = {
fileMenu; editMenu; faceMenu;
optionMenu; helpMenu;
};
static public JMenuBar
createMenuBar(Object'' menuBarData) {
JMenuBar menuBar = new JMenuBar();
for(int i = 0; i 《 menuBarData。length; i++)
menuBar。add(
createMenu((Object'''')menuBarData'i'));
return menuBar;
}
static ButtonGroup bgroup;
static public JMenu
createMenu(Object'''' menuData) {
JMenu menu = new JMenu();
menu。setText((String)menuData'0''0');
menu。setMnemonic(
((Character)menuData'0''1')。charValue());
// Create redundantly; in case there are
// any radio buttons:
bgroup = new ButtonGroup();
for(int i = 1; i 《 menuData。length; i++) {
if(menuData'i''0' == null)
menu。add(new JSeparator());
else
menu。add(createMenuItem(menuData'i'));
}
return menu;
}
static public JMenuItem
createMenuItem(Object'' data) {
JMenuItem m = null;
MType type = (MType)data'1';
if(type == mi)
m = new JMenuItem();
else if(type == cb)
m = new JCheckBoxMenuItem();
else if(type == rb) {
m = new JRadioButtonMenuItem();
bgroup。add(m);
}
m。setText((String)data'0');
476
…………………………………………………………Page 478……………………………………………………………
m。setMnemonic(
((Character)data'2')。charValue());
m。addActionListener(
(ActionListener)data'3');
m。setEnabled(
((Boolean)data'4')。booleanValue());
if(data。length == 6)
m。setIcon((Icon)data'5');
return m;
}
Menus() {
setLayout(new BorderLayout());
add(createMenuBar(menuBar);
BorderLayout。NORTH);
JPanel p = new JPanel();
p。setLayout(new BorderLayout());
p。add(t; BorderLayout。NORTH);
p。add(l; BorderLayout。CENTER);
add(p; BorderLayout。CENTER);
}
public static void main(String args'') {
Show。inFrame(new Menus(); 300; 200);
}
} ///:~
这个程序的目的是允许程序设计者简单地创建表格来描述每个菜单,而不是输入代码行来建立菜单。每个菜
单都产生一个菜单,表格中的第一列包含菜单名和键盘快捷键。其余的列包含每个菜单项的数据:字符串存
在在菜单项中的位置,菜单的类型,它的快捷键,当菜单项被选中时被激活的动作接收器及菜单是否被激活
等信息。如果列开始处是空的,它将被作为一个分隔符来处理。
为了预防浪费和冗长的多个Boolean 创建的对象和类型标志,以下的这些在类开始时就作为 static final 被
创建:bT 和 bF 描述Booleans 和哑类 MType 的不同对象描述标准的菜单项(mi ),复选框菜单项(cb),和
单选钮菜单项(rb)。请记住一组Object 可以拥有单一的Object 句柄,并且不再是原来的值。
这个程序例子同样展示了JLables 和JMenuItems (和它们的衍生事物)如何处理图标的。一个图标经由它的
构建器置放进JLable 中并当对应的菜单项被选中时被改变。
菜单条数组控制处理所有在文件菜单清单中列出的,我们想显示在菜单条上的文件菜单。我们通过这个数组
去使用 createMenuBar(),将数组分类成单独的菜单数据数组,再通过每个单独的数组去创建菜单。这种方
法依次使用菜单数据的每一行并以该数据创建 JMenu,然后为菜单数据中剩下的每一行调用 createMenuItem()
方法。最后,createMenuItem()方法分析菜单数据的每一行并且判断菜单类型和它的属性,再适当地创建菜
单项。终于,像我们在菜单构建器中看到的一样,从表示 createMenuBar(menuBar)的表格中创建菜单,而所
有的事物都是采用递归方法处理的。
这个程序不能建立串联的菜单,但我们拥有足够的知识,如果我们需要的话,随时都能增加多级菜单进去。
13。19。10 弹出式菜单
JPopupMenu 的执行看起来有一些别扭:我们必须调用 enableEvents()方法并选择鼠标事件代替利用事件接收
器。它可能增加一个鼠标接收器但 MouseEvent 从 isPopupTrigger()处不会返回真值——它不知道将激活一
个弹出菜单。另外,当我们尝试接收器方法时,它的行为令人不可思议,这或许是鼠标单击活动引起的。在
下面的程序例子里一些事件产生了这种弹出行为:
//: Popup。java
// Creating popup menus with Swing
package c13。swing;
import java。awt。*;
477
…………………………………………………………Page 479……………………………………………………………
import java。awt。event。*;
import javax。swing。*;
public class Popup extends JPanel {
JPopupMenu popup = new JPopupMenu();
JTextField t = new JTextField(10);