2009-09-03 25 views
5

Javaでイベント、リスナーなどを使わずにマウスボタンの1つが停止しているかどうかを直接確認する方法はありますか? 100ミリ秒ごとにマウスボタンが押されていないかどうかをチェックして何かをするスレッドを持っていたいと思います。したがって、ユーザーがしばらくの間マウスボタンを押し続けると、いくつかの応答がトリガーされます。Javaマウスが押された - イベントなし

私が探しているのは、通常のイベント処理システムを経由せずに、マウスの状態を示すメソッドです。

ありがとう

+4

申し訳ありませんが、どうしてですか? –

答えて

4

私はこれがJavaでは不可能だと信じています。 JNIを通じて可能ですが、それは痛みの世界です。

イベントでこれを行うのは難しいことではなく、他のアプリともっとよく統合されます。ここでは、マウスボタンが押されている間、コンソールに100ミリ秒ごとに書き込む例です:

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(); 
      } 
     } 

    } 
} 

異なる期間の時間の後に(例えば絵筆モードの変更など)が異なることを行うために、これを変更することは単純明快でなければなりません。

+0

うわー、ありがとう。私はタイマーを使ってみよう。 –

4

これが可能かどうかはわかりません。

しかし、現在のマウスの状態を追跡することが唯一の仕事であるイベントハンドラを書くことができます。その後、あなたの100msのコードはそれを照会することができます。

+0

私はそれについて考えましたが、もう少し複雑です。私は、誰かがマウスの状態を直接取​​得する方法を知っているかどうかを試してみると思っていました。そうでなければ、イベントハンドラを使用します。 –

2

可能かどうかを確認してもよろしいですか?

あなたはそうしたクリックを逃しているようです。 100ミリ秒は10分の1秒です。多くのクリックはそれほど長くはありません。

ポーリングループを短くしても、クリックしていなかったウィンドウを絞り込むだけで、クリック回数が少なくなることがあります。しかし、それはまだ競争条件になるでしょう。

私は、問題の複雑さに関する懸念は、スレッドの問題に対処することに起因すると推測していますが、私たちに詳細な情報を提供しない限り、大きな助けとはなりません。

+0

100ミリ秒は私の頭の上からちょうど離れていたので、私は別の時代に実験しようと考えていました。欠落したクリックについての良い点。 私は、グラフィックプログラムのためのペイントブラシツールとしてマウスを動作させようとしています。これには、マウスが押された時間などに基づいてプログラムが応答する必要があります。 私が知りたいのは、このような低レベルのマウス状態の直接クエリが可能かどうかです。それから実験を行い、その動作がどれだけうまくいくかを見て、それを使用するか、イベントハンドラ代わりに。 –

+0

ペイントプログラムでは、MouseMotionListenerを使用し、描画を可能にするためにmouseDragged()を実装しました。 –

0

リスナーを作成してマウスの状態を処理するだけで十分です。 AWTEventListenerの概要については、Global Event Listenersを参照してください。これにより、すべてのマウスイベントを1つのリスナーでリスナーすることができます。

その後、リスナーでタイマーを開始します。

関連する問題