昨天已经将菜单的样子制作出来了。但是现在只有一个样子,里面的功能还没有完成。今天主要要完成菜单的功能制作,主要是助记符、快捷键及事件操作。
下面将分别介绍各种功能的实现。
1. 助记符及快捷键
助记符就是菜单及菜单项括号里的字母,这些字母的作用就是在菜单(菜单项)的上级节点被激活后,点一下字母即可打开该菜单(菜单项)。JMenu中使用setMnemonic()方法设置。而各种按键的设置则要用到KeyEvent类中的VK_XXX变量。比如,编辑菜单的助记符是E,则代码为:
JmEdit.setMnemonic(KeyEvent.VK_E);
而设置快捷键则是setAccelerator()方法,参数是KeyStroke类,代表键盘上的组合键,这个组合键的初始化参数是虚拟键及修饰符的按位或组合。虚拟键指的是键盘上的普通按键,而修饰符则是键盘上的CTRL、ALT、SHIFT、META等几个按键。如果快捷键没有修饰符,则值为0;如果有一个则从ActionEvent类中选择XXX_MASK的变量,如果有多个则是这些变量的按位或,如
快捷键 | 代码 |
F1 | setAccelerator(new KeyStroke(KeyEvent.VK_F1,0)) |
CTRL+C | setAccelerator(new KeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK)) |
ALT+SHIFT+D | setAccelerator(new KeyStroke(KeyEvent.VK_C, ActionEvent.ALT_MASK|ActionEvent.SHIFT_MASK)) |
结果如下图所示。可以看见,在菜单项的右边出现了快捷键的组合名,在计算器打开的情况下按这些组合键即可使用相应菜单功能:
2. 事件处理
接下来就是事件处理了。因为我只是做个简易计算器,所以只实现了查看中的“退出”、编辑中的“复制”、“粘贴”,及帮助中的“关于计算器”。
照例说说各部分的功能:
退出:退出计算器。
复制:将显示区的内容复制到剪贴板中。
粘贴:将剪贴板中的内容粘贴到显示区。如果剪贴中的内容是数则复制到显示区中,否则从前往后粘贴最大限度的数的部分进去。如果字符串的第一个符号是小数点,则在前面补0。如剪贴板的内容是.24515saklfj,则显示区粘贴的内容是0.24515。
关于计算器:弹出对话框,显示版权信息。
退出比较简单,就是System.exit(0)。
复制和粘贴需要用到Clipboard类和Transferable类,分别处理剪贴板及转换的相应动作。而粘贴好需要一些后处理的操作。
关于则是用到JoptionPane来显示各种提示框,这里是一个信息会话框,因此用showMessageDialog。具体代码如下
事件处理的方法如2中所说,addActionListener,不过因为菜单的事件响应差异较大,我使用了匿名内部类来设置监听器。
/ **
* 设置监听器
*/
public void addActionListener() {
// 复制按钮的响应
jtEdit[0].addActionListener(newActionListener() {
public voidactionPerformed(ActionEvent e) {
Button bts = new Button();
Clipboard clipboard =Toolkit.getDefaultToolkit()
.getSystemClipboard();
Transferable trandata = newStringSelection(bts.jt.getText());
clipboard.setContents(trandata,null);
}
});
// 粘贴按钮的响应
jtEdit[1].addActionListener(newActionListener() {
public voidactionPerformed(ActionEvent e) {
Clipboard clipboard =Toolkit.getDefaultToolkit()
.getSystemClipboard();
Transferable clipT =clipboard.getContents(null);
Button bts = new Button();
if(clipT.isDataFlavorSupported(DataFlavor.stringFlavor)) {
try {
String clipContent =(String) clipT
.getTransferData(DataFlavor.stringFlavor);
StringBuffer text = newStringBuffer();
for (int i = 0; i <clipContent.length(); i++) {
if(clipContent.charAt(i) >= '0'
&&clipContent.charAt(i) <= '9'
||clipContent.charAt(i) == '.') {
if (i == 0&& clipContent.charAt(i) == '.') {
text.append("0.");
} else {
text.append(String.valueOf(clipContent
.charAt(i)));
}
}
}
if (text.length() > 0)
bts.jt.setText(text.toString());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
});
// 关于...菜单响应,显示对话框
jtHelp[1].addActionListener(newActionListener() {
public voidactionPerformed(ActionEvent e) {
StringBuffer text = newStringBuffer("你大佬我 倾情制作\n").append(
"版本 1.0\n").append("版权所有 ?伟大公司保留一切权利 2013.2.23\n")
.append("本软件及其用户界面受所在国家/地区知识产权法律保护");
JOptionPane.showMessageDialog(JEdit,text, "关于计算器",
JOptionPane.PLAIN_MESSAGE);
}
});
最后看看“关于计算器”的会话框效果:
到此,简易计算器的所有内容都已经编写完毕。我也对Java的图形化编程有了一定的了解。不过Swing中的内容还有许多,以后有机会再慢慢挖掘了。