2013-03-30 22 views
2

我正在做一個undecorated JFrame,所以我需要一種方法來改變窗口的位置。到目前爲止,我可以讓窗戶跟着鼠標,但我不能讓它停下來。我添加了一個ActionPerformedJButton知道如果沒有聽衆或不同的方法點擊鼠標

test = true; 
while (test) { 
    setLocation(MouseInfo.getPointerInfo().getLocation().x - 20, MouseInfo.getPointerInfo().getLocation().y - 20); 
} 

偏移量是否有保持JButton裏面的指針,該圖形看起來while期間按下。它創造奇蹟,非常快。但我不知道如何讓它停止。我試圖添加一個MouseClicked,它將test設置爲false,但它不起作用。顯然,循環運行時沒有Listener工作。

有沒有辦法知道鼠標是否在while內部被點擊?那麼,沒有聽衆或事件?或者還有另一種重新定位窗口的方法嗎?

編輯:再次

由於尤爾根·卡米萊裏,但我想補充他的榜樣的修改版本,我相信這是簡單的,包含幾乎沒有必要的東西,使這項工作。

package testbench; 

import java.awt.EventQueue; 
import java.awt.HeadlessException; 
import java.awt.Point; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import javax.swing.JFrame; 
import javax.swing.WindowConstants; 

public class DraggableFrame 
extends JFrame 
implements MouseListener, MouseMotionListener { 

    static Point dragged = null; 
    static Point pressed = null; 

    public DraggableFrame() throws HeadlessException { 
     addMouseListener(this); 
     addMouseMotionListener(this); 
     setBounds(0, 0, 320, 240); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setUndecorated(true); 
    } 

    public static void main (String args[]) {   
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new DraggableFrame().setVisible(true); 
      } 
     }); 
    } 

    @Override 
    public void mouseClicked (MouseEvent e) {} 

    @Override 
    public void mouseDragged (MouseEvent e) { 
     dragged = e.getLocationOnScreen(); 
     setLocation(
     (int)(dragged.getX() - pressed.getX()), 
     (int)(dragged.getY() - pressed.getY())); 
    } 

    @Override 
    public void mouseEntered (MouseEvent e) {} 

    @Override 
    public void mouseExited (MouseEvent e) {} 

    @Override 
    public void mouseMoved (MouseEvent e) {} 

    @Override 
    public void mousePressed (MouseEvent e) { 
     pressed = e.getPoint(); 
    } 

    @Override 
    public void mouseReleased (MouseEvent e) {} 
} 

不介意空的重寫方法,它們是必要的。在我正在開發的實際程序中,我爲聽衆使用了一個單獨的類,這也同樣適用。此外,你是否實現一個監聽器或擴展一個適配器似乎並不重要。一方面,你可以實現兩個接口。另一方面,您不需要重寫擴展抽象類的所有方法。

另外,如果將偵聽器添加到幀的容器中,此方法將起作用。但是,它的行爲就好像該容器位於(0,0)處。您必須在setLocation()上添加一些補償。

+0

我想要的文本之前說「你好」,但在第一提交和兩個編輯我做了,該行消失。讓SO人添加代碼來刪除'你好? – GuiRitter

+1

主要的問題是,你的循環內部的事件分派線程,這將阻止任何新的事件被處理(或重新繪製發生) – MadProgrammer

+0

@MadProgrammer我不知道重繪,因爲正如我所說,我第一次嘗試運行良好,就像在用鼠標移動的框架中一樣,但是要感謝有關事件的通知。 – GuiRitter

回答

1

試試這個:

public class UndecoratedJFrame extends JFrame { 

    Point origin; 
    Point origin2; 

    public UndecoratedJFrame() { 
     setUndecorated(true); 
     initComponents(); 

     setVisible(true); 
    } 

    private void initComponents() { 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mousePressed(java.awt.event.MouseEvent evt) { 
       formMousePressed(evt); 
      } 
     }); 

     addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 
      public void mouseDragged(java.awt.event.MouseEvent evt) { 
       formMouseDragged(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 400, Short.MAX_VALUE) 
     ); 

     layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 300, Short.MAX_VALUE) 
     ); 

     pack(); 
    }      

    private void formMouseDragged(java.awt.event.MouseEvent evt) {         
     origin2 = new Point(evt.getLocationOnScreen()); 
     setLocation((int)(origin2.getX() - origin.getX()), (int)(origin2.getY() - origin.getY())); 
    }         

    private void formMousePressed(java.awt.event.MouseEvent evt) {         
     origin = new Point(evt.getPoint()); 
    } 
} 
+0

是的!完美的作品,非常簡單。謝謝你的幫助! – GuiRitter

2

所以我需要一種方法來改變窗口的位置。

對於不同的方法檢查出Moving Windows

相關問題