swt中在shell上设置快捷键

要对一个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),另一种可行方法是:

  1.  添加一个监听器

 

        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了的对象还会留在内存中。

 

这种方法虽然是解决了需求,但是显得有些繁琐,还得寻找更加简单的方法。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值