2014-01-12 4 views
1

setLocation() 및 마우스 위치를 사용하여 화면 주위로 드래그 할 수있는 장식 (제목 표시 줄, 닫기 버튼 등)이없는 JFrame이 있습니다. 윈도우와의 mouseEntered 이벤트에 불행하게도,의 mouseExited 이벤트는 윈도우의 첫 번째 이동에 따라이라고 frame.setLocation()이 호출 될 때 Java mouseExited 이벤트가 발생합니다.

...

  1. 이동 마우스
  2. 클릭 마우스를 해고하고의 mousePressed 이벤트가 발생합니다.
  3. 끌기 mouse 및 mouseDragged 이벤트가 발생하고 setLocation이 호출됩니다.
  4. 마우스가 창에 있어도 mouseExited 이벤트가 발생합니다!
  5. 이 시점에서 마우스를 창 밖으로 이동하면 mouseExited가 실행되지 않습니다.
  6. , 나는이 문제를 해결하려면 어떻게 단지 수동으로 화면에 마우스 위치를 테스트 이외의 1

단계로 다시 재설정 아웃 한 후 다시 마우스를 이동?

편집 : 여기에이 코드

import java.awt.*; 
import javax.swing.*; 
import java.awt.Event; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 

class DragNDropper implements MouseMotionListener, MouseListener 
{ 
    private int x, y; 
    private int dx, dy; 

    private boolean clicked; 

    private JFrame frame; 

    public DragNDropper(JFrame frame) 
    { 
    dx = dy = 0; 
    this.frame = frame; 
    } 

    public void mouseDragged(MouseEvent e) 
    { 
    x = e.getXOnScreen(); 
    y = e.getYOnScreen(); 

    frame.setLocation(x-dx, y-dy); 
    } 

    public void mouseMoved(MouseEvent e) 
    { 
    x = e.getXOnScreen(); 
    y = e.getYOnScreen(); 
    } 

    public void mouseClicked(MouseEvent e) 
    { 

    } 

    public void mousePressed(MouseEvent e) 
    { 
    clicked = true; 
    dx = e.getX(); 
    dy = e.getY(); 
    } 

    public void mouseReleased(MouseEvent e) 
    { 
    clicked = false; 
    } 

    public void mouseEntered(MouseEvent e) 
    { 
    System.out.println("Mouse entered"); 
    } 


    public void mouseExited(MouseEvent e) 
    { 
    System.out.println("Mouse exited"); 
    } 
} 


public class Program 
{ 
public static void main(String[] argv) 
{ 
JFrame jf = new JFrame(); 
DragNDropper dnd = new DragNDropper(jf); 

jf.setSize(new Dimension(512, 512)); 
jf.addMouseListener(dnd); 
jf.addMouseMotionListener(dnd); 

jf.show(); 
} 
} 
+1

를, 문제를 보여주는 [MCVE] (http://stackoverflow.com/help/mcve) 게시 할 수 있습니다. –

+0

@ 앤드류 톰슨 완료. –

+0

'Error : 메인 메소드를 클래스 DragNDropper에서 찾을 수 없습니다. 메인 메소드를 다음과 같이 정의하십시오 : public static void main (String [] args)'.. MCVE는 메인을 포함합니다. –

답변

2

모든 것이 잘 작동 코드의 증류수 버전이 있습니다. frame.show()을 사용 중지하십시오. JFrame을 표시하는 데 사용되는 것을 알게 된 곳에서 frame.setVisible(true)을 대신 사용하십시오. 문제에 대해 좀 더 설명해주십시오. 코드의 수정을 살펴 제발 : 더 나은 도움을 빨리 들어

import java.awt.*; 
import java.awt.Event; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import javax.swing.*; 

public class DragNDropper implements MouseMotionListener, MouseListener { 

    private int x, y; 
    private int dx, dy; 
    private boolean clicked;  
    private JFrame jf; 

    public static void main(String[] argv) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new DragNDropper().displayGUI(); 
      } 
     }); 
    } 

    private void displayGUI() { 
     dx = dy = 0; 
     jf = new JFrame(); 
     jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     jf.setUndecorated(true); 

     jf.setSize(new Dimension(512, 512)); 
     jf.addMouseListener(this); 
     jf.addMouseMotionListener(this); 

     jf.setVisible(true); 
    } 

    public void mouseDragged(MouseEvent e) { 
     x = e.getXOnScreen(); 
     y = e.getYOnScreen(); 
     jf.setLocation(x-dx, y-dy); 
    } 

    public void mouseMoved(MouseEvent e) { 
     x = e.getXOnScreen(); 
     y = e.getYOnScreen(); 
    } 

    public void mouseClicked(MouseEvent e) { 
    } 

    public void mousePressed(MouseEvent e) { 
     clicked = true; 
     dx = e.getX(); 
     dy = e.getY(); 
    } 

    public void mouseReleased(MouseEvent e) { 
     clicked = false; 
    } 

    public void mouseEntered(MouseEvent e) { 
     System.out.println("Mouse entered"); 
    } 

    public void mouseExited(MouseEvent e) { 
     System.out.println("Mouse exited"); 
    } 
} 
+0

흥미를 돋우는; 클래스를 병합하고 EventQueue.invokeLater를 사용하면 많은 차이점은 없을 것입니다. 아무튼 감사합니다! –