2009-09-03 5 views
5

Java에서 마우스 버튼 중 하나가 이벤트, 리스너 등을 사용하지 않고 다운되어 있는지 직접 확인하는 방법이 있습니까? 100 밀리 초마다 마우스 버튼이 눌려져 있는지 확인한 후 뭔가를하는 스레드를 갖고 싶습니다. 따라서 사용자가 잠시 동안 마우스 버튼을 누르고 있으면 여러 응답이 트리거됩니다. 처리 시스템 -Java mouse pressed - 이벤트 없음

그래서 내가 무엇을 찾고있어 일반적인 이벤트를 거치지 않고, 마우스의 상태를 제공하는 방법이다.

감사

+4

죄송하지만 ... 왜? –

답변

4

저는 자바에서는 이것이 가능하지 않다고 믿습니다. 글쎄 그것은 JNI를 통해 가능하지만 그것은 고통의 세계입니다. 이벤트와 이렇게

어렵지 않다, 그리고 응용 프로그램의 나머지 부분과 더 나은 통합됩니다. 솔직해야 다른 기간의 시간이 지나면 (예 : 변경 붓 모드로) 다른 일을하기 위해이 수정

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

public class Test { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     final JLabel label = new JLabel("Click on me and hold the mouse button down"); 
     label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     frame.getContentPane().add(label); 
     label.addMouseListener(new TimingMouseAdapter()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private static class TimingMouseAdapter extends MouseAdapter { 
     private Timer timer; 

     public void mousePressed(MouseEvent e) { 
      timer = new Timer(100, new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("Mouse still pressed..."); 
       } 
      }); 
      timer.start(); 
     } 

     public void mouseReleased(MouseEvent e) { 
      if (timer != null) { 
       timer.stop(); 
      } 
     } 

    } 
} 

다음은 마우스 버튼을 누르고있는 동안 콘솔에 매 100 밀리 작성의 예입니다.

+0

와우, 고마워. 타이머를 사용해 보겠습니다. –

4

나는 이것이 가능 여부를 모른다 - 어쩌면이다.

그러나, 당신은 항상 그의 유일한 일 현재 마우스 상태를 추적하는 이벤트 핸들러를 작성할 수 있습니다. 그런 다음 100ms 코드가 쿼리 할 수 ​​있습니다.

+0

나는 그것을 생각했지만 조금 더 복잡합니다. 마우스의 상태를 직접 알 수있는 메소드를 알고 있는지, 그리고 그렇지 않은 경우 이벤트 핸들러를 사용 하는지를 시도하고 볼 수 있다고 생각했습니다. –

2

가능한지 여부와 상관없이 수행 하시겠습니까?

클릭 수를 놓치게 될 것 같습니다. 100 밀리 초는 10 분의 1 초입니다. 많은 클릭이 그렇게 길지 않습니다. 당신이 당신의 폴링 루프가 짧게 경우에도

은, 당신이하고있는 모든 사용자가 클릭을 놓칠 수있는 동안 창을 축소하는 것입니다, 그래서 덜 자주 클릭을 놓칠 수 있습니다. 그러나 여전히 경쟁 조건이 될 것입니다.

나는 합병증에 대한 우려가 스레딩 문제를 처리하는 데에서 유래 같은데요,하지만 당신은 우리에게 더 많은 정보를 제공하지 않는 한, 우리는 당신에게 많은 도움을 줄 수 없습니다.

+0

100 밀리가 내 머리 꼭대기에서 떨어져서, 나는 여러 번 실험을 계획하고 있었다. 누락 된 클릭에 대한 좋은 점. 저는 마우스를 얼마나 오랫동안 누르는 지에 따라 프로그램을 응답하도록하는 그래픽 프로그램의 붓 도구로 마우스 작업을하려고합니다. 내가 알기를 원하는 것은 마우스 상태에 대한이 낮은 수준의 직접 쿼리를 수행 할 수 있는지 여부입니다. 그런 다음 실험 해보고 작동하는지 확인하고 사용하거나 이벤트 처리기를 사용해 봅니다. 대신. –

+0

페인팅 프로그램의 경우 MouseMotionListener를 사용하고 drawing을 허용하기 위해 mouseDragged()를 구현했습니다. –

0

마우스 상태를 처리하기 위해 Listener를 작성하기 만하면됩니다. 단일 청취자로 모든 마우스 이벤트를 청취 할 수있는 AWTEventListener에 대한 소개는 Global Event Listeners을 참조하십시오.

그러면 청취자에서 타이머를 시작할 것입니다.