2011-01-07 6 views
4

마우스 클릭에 반응하는 작은 코드를 작성하고 싶습니다. 그러나 자바 컴포넌트에 대한 클릭을 경청하는 것이 유일한 방법 인 것 같습니다. 모든 클릭에 대한 직접 청취자가 좋습니다.전체 시스템에서 마우스 클릭을 듣습니다 (JFrame 등이 아님)

실제로 이것을 Java로 구현할 수 있습니까?

미리 감사드립니다.

업데이트 :

는 일부 C 코딩과 JNI를 통해 후크를 필요가 있다는 발견했다.

http://www.jotschi.de/?p=90

안부에

더 많은 정보,

fnst

답변

1

안되는 생각에 대한 때문에 샌드 박스 개봉 된이에서 실행하는, 그래서

0

음식을 생각한다.에 포인트를 사용 클릭 발생 위치를 감지하는 자바. http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Point.html

인정 하듯이, 필자는 테이블 뭔가 같은에서 행을 검출 한 번 전에 그것을 사용하지만, 필자는이 아닌 경우 QN : 죄송

public void mouseClicked(MouseEvent e) { 
    JTable target = (JTable)e.getSource(); 
    //get the coordinates of the mouse click 
    Point p = e.getPoint(); 
    //get the row index that contains that coordinate 
    row= target.rowAtPoint(p); 
} 

메신저 답변을 발견 한 것은 가장 가까운 것 당신이 찾고있는 것이지만 그렇지 않으면 구성 요소를 클릭하는 것만이 유일한 방법입니다. 컨테이너를 클릭하는 대안? 그게 말이 안되니?

0

내가 아는 한, 원하는 것을 성취하기위한 쉬운 방법은 없습니다. 그러나이 작업을 수행하기 위해 무엇을 현대적인 방법을 잘 .. 할 수 원하는, 당신이 제 3 자 사용하고자하는 경우

package mouseclickevent; 
import java.awt.AWTEvent; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.MenuComponent; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import java.awt.event.MouseEvent; 
import java.lang.reflect.Method; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 


public class FrmEvent extends JFrame { 
    public FrmEvent(){ 
     JPanel panel = new JPanel(); 
     getContentPane().add(panel); 
     JButton btn = new JButton("Test"); 
     panel.add(btn); 
     panel.add(new JTextField("Test")); 
     btn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       FrmEvent frm = new FrmEvent(); 
       frm.setBounds(300,300, 200, 200); 
       frm.show(); 

      } 
     }); 

    } 

    private void consumeEvents() { 
     try { 
      if (Thread.currentThread().getClass().getName().endsWith(
      "EventDispatchThread")) { 
       EventQueue eq = null; 
       eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); 

       if (eq == null) { 
        return; 
       } 
       while (isVisible() || isShowing()) { 
        AWTEvent event = eq.getNextEvent(); 
        Object src = event.getSource(); 
        Class kActiveEvent= Class.forName("java.awt.ActiveEvent"); 
        if (kActiveEvent != null) { 
         if (kActiveEvent.isInstance(event)) { 
          Method m; 
          Class types[] = {}; 
          Object args[] = {}; 
          m = kActiveEvent.getMethod("dispatch", types); 

          if (m != null) { 
           m.invoke(event, args); 
           continue; 
          } 
         } 
        } 
        dispatchEvent(src, event); 
       } 
      } 

     } 
     catch (Exception e) { 
      e.printStackTrace(); 
      throw new RuntimeException(e); 
     } 
    } 
    private void dispatchEvent(Object src, AWTEvent event) { 
     if (event.getID()== MouseEvent.MOUSE_CLICKED) { 
      System.out.println("mouseClicked"); 
     } 
     if (src instanceof Component) { 
      ((Component) src).dispatchEvent(event); 
     } else if (src instanceof MenuComponent) { 
      ((MenuComponent) src).dispatchEvent(event); 
     } 
    } 

    public void show(){ 
     super.show(); 
     consumeEvents(); 
    } 

    public static void main(String[] args) { 

     FrmEvent frm = new FrmEvent(); 
     frm.setBounds(300,300, 200, 200); 
     frm.show(); 

    } 
} 
1

그것은 완벽하게 가능 ... 당신이 java.awt.Dialog의 쇼 방법을 검토 제안 라이브러리 -

순수 Java 응용 프로그램에서는 사용할 수없는 JNI를 사용하여 이러한 기능을 제공합니다.

관련 문제