1

コンポーネントに MouseListener があり、mousePressed イベントを必要とせずに mouseReleased イベントをリッスンしたいと考えています。ユーザーが別のボタン、デスクトップ、または他のウィンドウ (または実際には何か) を押してコンポーネントを離したかどうかを検出するにはどうすればよいですか?

たとえば、次の例では、「クールではない」ではなく「クール」と出力するにはどうすればよいでしょうか?

titleBar.addMouseListener(new MouseListener()
{
    @Override public void mouseReleased(MouseEvent e)
    {
        System.out.println("cool");//Detect this
    }
    @Override public void mousePressed(MouseEvent e)
    {
        System.out.print("Not ");//Without this having to happen first
    }
    @Override public void mouseExited(MouseEvent e)
    {
    }
    @Override public void mouseEntered(MouseEvent e)
    {
    }
    @Override public void mouseClicked(MouseEvent e)
    {
    }
});
4

2 に答える 2

4

mousePressed が別のアプリケーションで発生した場合、mouseReleased をリッスンすることはできません。これは、マウスを放したときに Java アプリケーションにフォーカスがないためです。Java con は、フォーカスがある場合にのみイベントを処理します。

Java アプリケーション内では、すべての mouseReleased イベントをリッスンできます。ただし、この場合、mousePressed イベントを生成したコンポーネントに対して mouseReleased イベントが生成されます。そのため、mouseEntered および mouseExited イベントもリッスンする必要があります。したがって、mouseReleased イベントの前に mouseEntered イベントがある場合は、mouseEntered イベントのソースを使用して、mouseReleased イベントのオブジェクトを取得する必要があります。

これには、AWTEventListener を使用できます。詳細については、グローバル イベント リスナーを参照してください。

于 2013-06-11T01:26:12.617 に答える
0

Java コンポーネントは、マウス カーソルがコンポーネントの境界内にあるときに MouseEvents を検出できます。アプリケーション ウィンドウはまだフォーカスされている場合がありますが (つまり、ドラッグ アンド ドロップによるウィンドウのサイズ変更)、マウス カーソルがコンポーネントの境界外にあるため、アプリケーション ウィンドウ コンポーネントが MouseListener であっても、MouseEvent はアプリケーション ウィンドウ コンポーネントに通知されなくなりました。

于 2021-11-13T19:47:33.173 に答える