为什么捕获不到功能键?
在applet的button上产生ActionEvent ae
无论按下哪个功能控制键如ctrl,shift等,得到的ae.getModifiers()总是0
不知下述代码有误吗?
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class ButtonDemo extends Applet
implements ActionListener {
String msg1 = "", msg2 = "";
Button yes, no, maybe;
Label l1,l2;
public void init() {
yes = new Button("Yes");
no = new Button("No");
maybe = new Button("Undecided");
l1 = new Label(" ");
l2 = new Label(" ");
yes.setActionCommand("是的");
add(yes);
add(no);
add(maybe);
add(l1);
add(l2);
yes.addActionListener(this);
no.addActionListener(this);
maybe.addActionListener(this);
}
public void actionPerformed(ActionEvent ae) {
String str = ae.getActionCommand();
if(str.equals("是的")) {
msg1 = "You pressed Yes.";
}
else if(str.equals("No")) {
msg1 = "You pressed No.";
}
else {
msg1 = "You pressed Undecided.";
}
switch(ae.getModifiers())
/*无论按下哪个功能控制键这里的ae.getModifiers()总是返回0,怎么回事?*/
{
case ActionEvent.ALT_MASK: msg2=" ALT Pressed!";
break;
case ActionEvent. CTRL_MASK: msg2=" CTRL Pressed!";
break;
case ActionEvent.SHIFT_MASK: msg2=" SHIFT Pressed!";
break;
case ActionEvent. META_MASK: msg2=" META Pressed!";
break;
default: msg2=" NO control Pressed!";
}
l1.setText(msg1);
l2.setText(msg2);
}
}
问题点数:100、回复次数:16Top
1 楼junyi2003(超级菜鸟)回复于 2003-11-04 11:10:07 得分 0
关注Top
2 楼LoveRose(旺旺)回复于 2003-11-04 11:11:10 得分 50
ae.getModifiers()得到的结果是有的,
是你的代码有错误,得到的结果跟ActionEvent.SHIFT_MASK这类的常量不一致而已
比如按下Ctrl, getModifiers()值为128,而ActionEvent. CTRL_MASK的值是2
Top
3 楼loveyousomuch(★Allen★)回复于 2003-11-04 11:18:14 得分 0
呵呵,路过一下!Top
4 楼LoveRose(旺旺)回复于 2003-11-04 11:18:39 得分 0
case语句中改为
KeyEvent.ALT_DOWN_MASK 等就可以了Top
5 楼sneat(可乐)回复于 2003-11-04 11:33:36 得分 0
好像不是这么回事,我在调试的过程中看了getModifiers()的值,每次均为0,
另外KeyEvent没有ALT_DOWN_MASK这个域。Top
6 楼kinzey34(无声之舞)回复于 2003-11-04 11:33:58 得分 50
把你代码里的下面这行:
switch(ae.getModifiers())
替换为:
switch(ae.getModifiers()/64)
就可以了Top
7 楼LoveRose(旺旺)回复于 2003-11-04 11:37:14 得分 0
上面这种也是可以的
不过sneat(可乐) KeyEvent.AlT_DOWN_MASK肯定是有的
是不是jdk版本不同我的是1.4Top
8 楼kinzey34(无声之舞)回复于 2003-11-04 11:42:29 得分 0
KeyEvent.AlT_DOWN_MASK
是KeyEvent事件的常量,
你用的是ActionEvent,当然无此常量
并不是JDK版本的问题Top
9 楼LoveRose(旺旺)回复于 2003-11-04 11:56:26 得分 0
to:kinzey34(无声之舞)
AlT_DOWN_MASK是static 常量
随时可以调用
我只要他的int数值
Top
10 楼sneat(可乐)回复于 2003-11-04 12:21:19 得分 0
kinzey34(无声之舞) 的也不行,
问题出在这里,
JBuilder里我在switch(ae.getModifiers())处设了断点
但无论先前按下哪个功能控制键这里的ae.getModifiers()总是显示0
Top
11 楼kinzey34(无声之舞)回复于 2003-11-04 13:42:08 得分 0
你是同时用鼠标点了按钮和按下了CTRL等键吗?Top
12 楼sneat(可乐)回复于 2003-11-04 14:03:12 得分 0
按下了呀,在你的机器上能通过吗?Top
13 楼sneat(可乐)回复于 2003-11-04 15:32:35 得分 0
我还是发现了问题,在J2SE1.4下的情况正如旺旺和无声之鹤说的,但在1。3下ae.getModifiers()总是等于0;Top
14 楼sneat(可乐)回复于 2003-11-04 17:42:15 得分 0
研究了一下午,加上到sun的论坛上的提问竟发现,
a. 1.3版本的ae.getModifiers()在任何情况下返回0!
b. 1.4.1版本的Button(AWT)返回分别是64×1、2、4、8
c. 1.4.1版本的Jbutton(Swing)返回分别是16+1、2、4、8
不知为什么?
一下是老外回的一个例程,属于c情况
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ActionEventTest {
public static void main(String[] args) {
final JLabel label = new JLabel(" ", JLabel.CENTER);
JButton button = new JButton("generate event");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int modifiers = e.getModifiers();
String modifierText = "";
if((modifiers & ActionEvent.SHIFT_MASK) == 1)
modifierText =" SHIFT_MASK,";
if((modifiers & ActionEvent.CTRL_MASK) == 2)
modifierText= " CTRL_MASK,";
if((modifiers & ActionEvent.META_MASK) == 4)
modifierText =" META_MASK,";
if((modifiers & ActionEvent.ALT_MASK) == 8)
modifierText =" ALT_MASK",";
if(modifierText.equals(""))
modifierText = "none";
else
modifierText = modifierText.substring(0,modifierText.lastIndexOf(","));
label.setText("modifiers = " + modifierText);
}
});
JPanel northPanel = new JPanel();
northPanel.add(button);
String[] labelStrings = { "SHIFT_MASK 1", "CTRL_MASK 2", "META_MASK 4", "ALT_MASK 8" };
JPanel panel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.weighty = 1.0;
gbc.gridwidth = gbc.REMAINDER;
panel.add(label, gbc);
for(int i = 0; i < labelStrings.length; i++)
panel.add(new JLabel(labelStrings[i]), gbc);
JFrame f = new JFrame("ActionEvent Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(northPanel, "North");
f.getContentPane().add(panel);
f.setSize(400,300);
f.setLocation(300,400);
f.setVisible(true);
}
}
Top
15 楼kinzey34(无声之舞)回复于 2003-11-05 19:14:43 得分 0
sun把getModifiers()做成这样,是不是1.4的工程师对1.3的工程师不满意,或是swing的对awt的
有意见?Top
16 楼sneat(可乐)回复于 2003-11-07 23:45:32 得分 0
hehe 不知道Top




