2010-12-30 3 views
2

마우스 위치에서 직사각형을 그리는 데 문제가 있습니다. 마우스를 움직이면 칠해진 직사각형이 마우스 커서 뒤에서 뒤쳐집니다. 직사각형이 마우스에서 정확하게 움직이고 뒤처지지 않는지 확인하는 방법이 있습니까?마우스로 움직일 무언가를 그리는 데 지연이 있습니다.

여기에 약간의 예가 있습니다. 단 하나의 사각형이기 때문에 지연은 매우 미미하지만 거기에 있습니다. 더 큰 프로그램에서 나는 한 번에 한 톤 씩 그리는 중이다.

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 

import javax.swing.*; 

public class MouseTest { 
    JFrame window; 
    DrawPanel content; 

    public MouseTest(){ 
     window = new JFrame("Test"); 
     content = new DrawPanel(); 
     window.setContentPane(content); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setVisible(true); 
     window.pack(); 
    } 

    public static void main (String[] args){ 
     MouseTest test = new MouseTest(); 
    } 

    private class DrawPanel extends JPanel implements MouseMotionListener { 
     int mouseX; 
     int mouseY; 

     private DrawPanel(){ 
      setBackground(Color.BLUE); 
      setPreferredSize(new Dimension(400,400)); 
      addMouseMotionListener(this); 
     } 

     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      g.setColor(Color.RED); 
      g.fillRect(mouseX, mouseY, 20, 20); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void mouseMoved(MouseEvent e) { 
      mouseX = e.getX(); 
      mouseY = e.getY(); 
      repaint(); 

     } 
    } 

} 
+0

은 "이중 버퍼링"기본값입니까? ... 그냥 즉시 proove이 –

+0

지연을 재현 할 수 없습니다. – Favonius

답변

0

더 많은 작업이 수행되는 경우에도 변경된 영역 만 무효화하고 다시 칠하는 작업을하는 것이 좋습니다. 이렇게하면 많은 사이클을 절약 할 수 있습니다 (항상 완전한 백 그로우를 그리는 상상 ...).

크게 개선되었습니다.

편집 나는이 예

public void mouseMoved(MouseEvent e) { 
     repaint(mouseX, mouseY, 20, 20); 
     mouseX = e.getX(); 
     mouseY = e.getY(); 
     repaint(mouseX, mouseY, 20, 20); 
    } 

와 그것을 나 자신을 시험하고 개선이 조금 교육 (적어도 내 컴퓨터)이다 인정해야합니다. 당신은 아직도 당신이 생각하는 곳 사이의 불일치를 싫어하는 경우 커서가 어떤 : 어쨌든,이 기술은 ..

편집

그리고 더 치트 (마침내 개선을 볼 경우) 더 복잡한 페인트 방법을 사용해야합니다 시스템은 사용자가 더 나은 피드백을 줄 수 있도록 커서를 끄고 (http://www.java2s.com/Code/Java/2D-Graphics-GUI/HidethemousecursoruseatransparentGIFasthecursor.htm) 시도하십시오.

+0

아주 잘 작동하는 힌트를 주셔서 감사합니다! – weichsem

2

먼저 할 일은 모든 Swing/AWT 코드를 EDT로 옮기는 것입니다. 귀하의 응용 프로그램에서 그것은 일 수 있습니다 상관 없지만 들어갈 좋은 습관입니다.

그러나 두 방법 중 하나를 사용하여 지연을 재현 할 수 없었습니다.

public static void main (String[] args) 
{ 
    SwingUtilities.invokeLater(
     new Runnable() 
     { 
      public void run() 
      { 
       MouseTest test = new MouseTest(); 
      } 
     }); 
} 

스윙 스레딩에 대한 자세한 내용은 this article를 참조하십시오.

+0

링크 및 코드를 이용해 주셔서 감사합니다. – weichsem

1

"어긋나게"라고 말하면 커서가 사각형의 중심에 있지 않다는 뜻입니까? 귀하의 코드는 커서가 사각형의 왼쪽 상단 모서리를 가리 키도록, 당신은 그것을 중심으로 오프셋해야합니다.

+0

아니요. 커서가 항상 맨 위 지점에 있고 사각형의 왼쪽 위가 커서 뒤에 떨어지는 것을 원하지 않는다는 것을 의미하지 않습니다. – weichsem

0

클래스가 모든 모션 이벤트를 처리하기 때문에 사각형이 지연됩니다. 가장 최근 이벤트 만 처리했다면 직사각형이 최신 상태가됩니다 (위치가 큰 점프가있을 수 있음). 이 작업을 수행하는 한 가지 방법은 현재 마우스 위치를 기반으로 사각형을 그리는 별도의 스레드를 실행하는 것입니다.이 스레드는 mouseMoved() 메서드로 업데이트됩니다. 마우스 위치 변수에 대한 액세스를 동기화해야합니다.

+0

감사합니다. – weichsem

관련 문제