要对一个shell设置快捷键添加监听器事件时,直接在shell上添加一个监听器的方法行不通。如以下方法:
addKeyListener(new KeyAdapter() {
public void keyPressed(final KeyEvent e) {
System.out.println(e.keyCode);
MessageDialog.openInformation(null, e.keyCode+"", e.keyCode+"");
}
});
这种方法在shell上注册的监听器没有用。不知道是为什么。。。
swt中设置快捷键,多个页面中(如view上有一个dialog),另一种可行方法是:
- 添加一个监听器
listener=new Listener(){
public void handleEvent(Event e) {
// TODO Auto-generated method stub
String tName=Field.getName();
Long tKey=Field.Getlong();
if(tName.equals("showmessages")&& tKey==LngKey ){
if(e.keyCode==27){
shell.dispose();
}else if (e.keyCode==16777221) {
revealImage.setLarge();
}else if (e.keyCode==16777222) {
revealImage.setSmall();
}else if(e.keyCode==47 || e.keyCode==16777263){
revealImage.setReverse();
}else {
}
}
}
};
2.给容器注册监听器
composite.getDisplay().addFilter(SWT.KeyDown, listener);
3. 并且在shell关闭时删除监听器
shell = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
shell.addShellListener(new ShellAdapter() {
public void shellClosed(final ShellEvent e) {
System.out.println("MessageQuery");
getParent().getDisplay().removeFilter(SWT.KeyDown, listener);
Field.setName("MessageQuery");
}
});
这里的移除监听器很重要,不然在一个view上打开的dialog中的注册的监听器还会是之前注册的,但是状态是dispose了。
这里的处理办法是:首先在view初始化的时候在Field类(Field随应用程序一直存在)中存一个格strName和longKey,用于区别注册的监听器属于哪一个shell,并且由于第一次再次打开shell时都会重新注册监听器,所以这里要加一个longKey来标记是新打开的一个shell。因为已经关闭了的shell的状态是dispose,其中的对象也会dispose了,所以不能用dispose了的对象。但是dispose了的对象还会留在内存中。
这种方法虽然是解决了需求,但是显得有些繁琐,还得寻找更加简单的方法。。。。