2013-06-28 1 views
2

마우스 동작 이벤트 발송을 구현하려고 노력하고 있지만 계속 스택 오버플로 오류가 발생합니다. mouseMoved (MouseEvent e) 메서드에서는 작동하지만 mouseDragged (MouseEvent e)에서는 작동하지 않습니다. 왜 아무도 단서가 있습니까? 어떤 해결책이 있습니까?MouseEvents를 전달하려고 시도 할 때 Stackoverflow 오류가 발생합니다. mouseMoved 작동하지만 mouseDragged하지 않습니다

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Test extends JFrame { 

public Test() { 
    setLayout(null); 
    setSize(500,500); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    addMouseMotionListener(new MouseMotionListener() { 
     public void mouseMoved(MouseEvent e) { 
      System.err.println("moved outside"); 
     } 
     public void mouseDragged(MouseEvent e) { 
      System.err.println("dragged outside"); 
     } 
    }); 

    JPanel inside = new JPanel(); 
    inside.setLocation(0, 0); 
    inside.setSize(100, 100); 
    inside.setBackground(Color.RED); 

    inside.addMouseMotionListener(new MouseMotionListener() { 
     public void mouseDragged(MouseEvent e) { 
      System.out.println("dragged inside"); 

      //The error occurs here when I begin dragging 
      //here and continue dragging to any other location. 

      Test.this.dispatchEvent(e); 
     } 
     public void mouseMoved(MouseEvent e) { 
      System.out.println("moved inside"); 
      Test.this.dispatchEvent(e); 
     } 
    }); 
    add(inside); 
} 

public static void main(String[] args) { 
    Test client = new Test(); 
} 
} 

내 실제 프로젝트는 많은 내부 구성 요소를 사용하여 내 목표는/각 구성 요소들이 자신의 마우스를 눌러 구현이 클릭/조치를 해제하고 모든 구성 요소에 영향을 미치는 프레임 핸들 마우스 움직임 및 드래그하는 것입니다.

다음은 마우스 동작 방식 모두에서 작동하는 유사한 코드입니다.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Test2 { 

public static void main(String... args) { 
    SwingUtilities.invokeLater(new Runnable() { 

     public void run() { 
      final JComponent outside = new JPanel(); 
      JComponent inside = new JPanel(); 
      inside.setBackground(Color.red); 
      inside.setPreferredSize(new Dimension(200, 200)); 
      inside.addMouseMotionListener(new MouseAdapter() { 
       public void mouseDragged(MouseEvent e) { 
        System.out.println("dragged inside"); 
        outside.dispatchEvent(e); 
       } 
       public void mouseMoved(MouseEvent e) { 
        System.out.println("moved inside"); 
        outside.dispatchEvent(e); 
       } 
      }); 

      outside.add(inside); 
      outside.setPreferredSize(new Dimension(300, 300)); 
      outside.addMouseMotionListener(new MouseAdapter() { 
       public void mouseMoved(MouseEvent e) { 
        System.err.println("moved outside"); 
       } 
       public void mouseDragged(MouseEvent e) { 
        System.err.println("dragged outside"); 
       } 
      }); 

      JFrame frame = new JFrame(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.add(outside); 
      frame.pack(); 
      frame.setVisible(true); 
     } 
    }); 
} 
} 

도움 주시면 감사하겠습니다.

답변

1

inside에있는 MouseMotionListener이 새로운 이벤트를 생성 중입니다. 이 이벤트는 무한 루프를 만드는 매우 동일한 MouseMotionListener에 의해 다시 포착됩니다. 이전 이벤트가 아직 완료되지 않은 상태에서 이벤트를 작성 중이므로 StackOverflowError 이벤트가 응용 프로그램을 터뜨릴 때까지 이벤트가 쌓입니다.

insideoutside에 위임하고 거기에서 끝내기 때문에 두 번째 코드에이 문제가 발생하지 않습니다.

+0

첫 번째 코드에서 왜 매우 동일한 MouseMotionListener가 호출 되었습니까? Test.this.dispatchevent (e)에서 Test.this를 사용하고 있습니다. 문제? mouseMoved와 함께 작동하는 이유에 대해 의아해합니다. mouseMoved를 사용할 때 "이동 된 내부"가 두 번째 코드와 비교하여 "외부로 이동 한 것"보다 훨씬 더 많이 튀어 나오는 것을 보았습니다. – Klungo

+0

첫 번째 코드에는 두 개의 MouseMotionListener가 있습니다. 마우스는 'inside'패널에서 움직입니다. 마우스가 패널과 윈도우에서 움직이기 때문에 두 리스너 모두가 실행됩니다. 내부의 청취자는 새로운 이벤트를 작성해, 그것을 양쪽 청취자에게 전달하는 Swing에 배치합니다. 내부의 청취자는 새로운 이벤트를 작성해, 그것을 양쪽 청취자에게 전달하는 Swing에 배치합니다. 내부의 청취자는 새로운 이벤트를 작성해, 그것을 양쪽 청취자에게 전달하는 Swing에 배치합니다. '내부'청취자는 새로운 이벤트를 생성하고이를 Swing에 게시하여 두 청취자에게 전달합니다. 붐! –

+0

이제 품질이 향상됩니다! – Klungo

관련 문제