2014-07-25 30 views
1

我傾向於移動我的底層JFrame s相當笨拙,通過使用創建一個靜態引用然後鼠標事件來更新Point的位置。移動未修飾的JFrame使用鼠標事件和線程更新

所以在試圖更好地理解主題,我想圍繞一個非常簡單的底塗JFrame移動如下:

  • 創建JFrame
  • 添加MouseListener
  • onMousePressed:Point p = Mousevent.getPoint();
  • onMouseReleased: Point p = Mousevent.getPoint();

,同時有一個線程不斷更新JFrame的位置。

但我無法弄清楚爲什麼controllerThread,不會做一個以上的迭代?還有一個解釋,爲什麼下面的代碼是可怕的將非常感激。

public AnimationStation() throws HeadlessException { 
    P=this.getLocation(); 
    run(); 

    class ControllerThread extends Thread{ 
     JFrame j; 
     public ControllerThread(JFrame j){ 
      this.j = j; 

     } 
     @Override 
     public void run(){ 
      this.j.setLocation(P); 
     } 
    } 
    ControllerThread ct = new ControllerThread(this); 
    ct.run(); 
    //ct.start(); 


} 

@Override 
public void run() { 
    this.setSize(d); 
    Container cp = this.getContentPane(); 
    P=this.getLocation(); 
    this.setUndecorated(true); 
    this.setVisible(true); 
    this.setAlwaysOnTop(true); 
    this.addMouseListener(new MouseListener() { 

     @Override 
     public void mouseClicked(MouseEvent me) { 
      P = me.getPoint(); 
     } 

     @Override 
     public void mousePressed(MouseEvent me) { 
      P = me.getPoint(); 
     } 

     @Override 
     public void mouseReleased(MouseEvent me) { 
      P = me.getPoint(); 
     } 

     @Override 
     public void mouseEntered(MouseEvent me) { 

     } 

     @Override 
     public void mouseExited(MouseEvent me) { 

     } 
    }); 


} 

回答

3

首先你ControllerThread不會在不同的線程運行,因爲你只需要調用它的run()方法。要啓動新線程,您必須調用其start()方法。其次,如果要在移動鼠標的同時連續移動框架,則必須註冊MouseMotionListenerMouseListener僅捕獲鼠標按下和釋放的事件(而不是鼠標移動或拖動的事件)。

建議解決方案:

註冊一個MouseListener檢測何時拖動開始(mousePressed())和MouseMotionListener檢測幀有多少拖動(mouseDragged()),並移動通過它被拖動的距離的框架:

public AnimationStation() { 
    MouseAdapter ma = new MouseAdapter() { 
     int lastX, lastY; 
     @Override 
     public void mousePressed(MouseEvent e) { 
      lastX = e.getXOnScreen(); 
      lastY = e.getYOnScreen(); 
     } 
     @Override 
     public void mouseDragged(MouseEvent e) { 
      int x = e.getXOnScreen(); 
      int y = e.getYOnScreen(); 
      // Move frame by the mouse delta 
      setLocation(getLocationOnScreen().x + x - lastX, 
        getLocationOnScreen().y + y - lastY); 
      lastX = x; 
      lastY = y; 
     } 
    }; 
    addMouseListener(ma); 
    addMouseMotionListener(ma); 
} 
+0

好吧,工作很順利很多謝謝你。儘管我試圖理解線程。這顯然是移動/拖動JFrame更好的方法。似乎我的運行方法只是缺少一個while循環? –

+0

@Fionán:不,你的'while'循環的概念隱含在Swing'EventQueue'中。 – trashgod

+0

@trashgod我假設從線程的一個隱含的時間在ct線程的run()上延伸,但是沒有改變給定的原始代碼與.start()或.run()..沒有添加while()因此是原始問題。 –