2009-08-26 3 views
0

내가 만들려고했던 효과는 마우스가 JPanel의 특정 영역에 들어갈 때마다 마우스 커서 아이콘이 변경되고 영역을 벗어날 때마다 기본값으로 전환된다는 것입니다. MouseMotionListener 클래스의 MouseMoved 기능을 사용하고 있습니다. 마우스를 움직이면 JPanel은 좌표가 특수 영역에 해당하는지 확인합니다.Java에서 커서 위치를 효율적으로 추적하는 방법은 무엇입니까?

그러나이 방법으로 컴퓨터 프로세서의 변형률이 매우 높으므로 더 효율적인 방법이 있는지 묻고 싶습니다. 어떤 도움을 주셔서 감사합니다.

이 프로그램이하는 것은 JPanel에 그림을 그리고 Connection 단추를 선택하면 사용자가 한 그림을 클릭 한 다음 다른 그림을 클릭하면 그림이 한 줄로 연결됩니다.

숫자는 JPanel에서 그려지며 해당 영역 경계가 저장되므로 마우스를 움직이면 현재 X 및 Y 좌표가 해당 영역 중 하나에 있는지 검사하고 커서가 변경되면 커서를 변경합니다. checkValidConnectionRegion은 현재 X 및 Y 변수가 그림의 영역 내에 있는지 확인합니다. 다음은 핸들러 코드입니다.

public void mouseMoved(MouseEvent e) 
    { 
     if(GUI.Connectionbutton.isSelected()) 
     { 
      x = e.getX(); 
      y = e.getY(); 

      checkValidConnectionRegion(); 

      if(validConnectionRegion) 
       setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); 
      if(!validConnectionRegion) 
       setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 
     } 
    } 

답변

2

나는 자바에 익숙하지 해요,하지만 문제는 Cursor.getPredefinedCursor 매번 당신이 그것을 부르는 새로운 커서 인스턴스를 만드는 것이 될 수 있습니다. (그게 사실인지 모르겠다.)

두 개의 커서에 대해 클래스에 두 개의 final 필드를 만들고 한 번만 설정해보십시오.

또한 validConnectionRegion이 실제로 변경된 경우 커서를 놓으십시오. 예를 들어

: 나는이 질문을 수정하고 코드를 게시합니다

final Cursor crosshairCursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR); 
final Cursor defaultCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); 

public void mouseMoved(MouseEvent e) 
{ 
    if(GUI.Connectionbutton.isSelected()) 
    { 
     x = e.getX(); 
     y = e.getY(); 

     boolean wasValid = validConnectionRegion; 
     checkValidConnectionRegion(); 

     if(wasValid != validConnectionRegion) 
      setCursor(validConnectionRegion ? crosshairCursor : defaultCursor); 
    } 
} 
2

아마도 당신의 MouseMoved 핸들러에서 비효율적 인 코드가 실행되고있을 것입니다.

MouseMoved 핸들러의 전체 소스를 게시 할 수 있습니까?

+0

좋아. – Hans

5

보다 효율적인 접근 방법은 보이지 않는 영역으로 작동하는 부모 JPanel에 자식 JPanel을 추가하는 것입니다. 그런 다음 자식 JPanel에 커서를 놓고 마우스 포인터를 움직이면 바뀌어야합니다.

JPanel mainPnl = new JPanel(new BorderLayout()); 

JPanel invisibleArea = new JPanel(); 
invisibleArea.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
invisibleArea.setPreferredSize(new Dimension(100, 100)); 

mainPnl.add(invisibleArea, BorderLayout.WEST); 
+0

나는 이것이 이것을 할 수있는 방법이 될 것이라고 생각하지만 인물이 그려지는 전체적인 방식을 바꿀 필요가있다. – Hans

+0

흠, 또는 여전히 메인 패널에 그림을 그릴 수 있으며 "연결 버튼"이 선택되면 보이지 않는 각 영역이 표시되도록 설정하십시오. – Hans

관련 문제