2012-11-06 75 views
1

我想創建自定義標題欄,所以我必須編寫代碼,將允許用戶調整窗口大小和移動殼(我用SWT),但我有問題移動和調整用鼠標(自定義標題欄)外殼

a)獲取鼠標向上

二)調整

shell.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseDown(final MouseEvent arg0) { 
      move=true; 
      oldx=arg0.x; 
      oldy=arg0.y; 
      Display.getDefault().syncExec(new Runnable() { 
       @Override 
       public void run() { 
        while (move) { 
          shell.setLocation(MouseInfo.getPointerInfo().getLocation().x-oldx, MouseInfo.getPointerInfo().getLocation().y-oldy); 
        } 
       } 

      }); 
     } 
     @Override 
     public void mouseUp(MouseEvent arg0) { 
      move=false; 
     } 
    }); 

移動殼工作它不捕獲鼠標事件的方式。另外我不知道如何調整大小。我試過

shell.setSize(MouseInfo.getPointerInfo().getLocation().x-shell.getBounds().x, MouseInfo.getPointerInfo().getLocation().y-shell.getBounds().y); 

但它不起作用。

回答

1

您的問題是,您正在等待事件#2(mouseDown)在事件#1(mouseUp)完成觸發之前觸發。 SWT一次處理一個事件。你需要#2射擊才能完成#1中的操作,因爲#2不會運行,所以永遠不會發生。這是一個僵局。您需要隨着鼠標移動而移動窗口,而不是基於mouseDown事件。看看這個example

+0

謝謝,與此同時也調整大小作品! – Andy

1

我認爲你的問題是移動shell的while循環在UI線程中同步運行。這將鎖定用戶界面並防止任何其他事件(包括鼠標向上)註冊。

嘗試將您的移動線程作爲單獨的後臺線程運行,以允許mouseDown呼叫返回,並且僅將shell.setLocation呼叫包裝在Display.getDefault().syncExec中。