カーソルを非表示にする方法はありますか (透明な画像をカーソルとして使用する以外に)?
ユーザーがJFrameのJPanelの外にマウスを置いたときに、カーソルを非表示にしたい。
カーソルを非表示にする方法はありますか (透明な画像をカーソルとして使用する以外に)?
ユーザーがJFrameのJPanelの外にマウスを置いたときに、カーソルを非表示にしたい。
クラスには最初から「空白」カーソルがないように見えるため、メソッドCursor
を使用して新しい「空白」カーソルを定義できます。Toolkit.createCustomCursor
これが私が試した1つの方法で、うまくいくようです:
// Transparent 16 x 16 pixel cursor image.
BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
// Create a new blank cursor.
Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(
cursorImg, new Point(0, 0), "blank cursor");
// Set the blank cursor to the JFrame.
mainJFrame.getContentPane().setCursor(blankCursor);
編集
JFrame
内のすべてがカーソルなしで終了するというコメントについては、Component
に含まJFrame
れる はコンテナ ( ) のカーソルを継承してしまうようJFrame
です。Component
、目的のカーソルを手動で設定する必要があります。
たとえば、 に がJPanel
含まれている場合、次のメソッドを使用してJFrame
、そのカーソルをJPanel
システムのデフォルトに設定できます。Cursor.getDefaultCursor
JPanel p = ...
// Sets the JPanel's cursor to the system default.
p.setCursor(Cursor.getDefaultCursor());
tl;dr AWT ツールキットは 2017 年になってもまだバグがあります。したがって、適切な解決策は呼び出すことです
w.setCursor( w.getToolkit().createCustomCursor(
new BufferedImage( 1, 1, BufferedImage.TYPE_INT_ARGB ),
new Point(),
null ) );
代わりは。
のJavadocページにcreateCustomCursor
よると、
新しいカスタム カーソル オブジェクトを作成します。表示する画像が無効な場合、カーソルは非表示になり (完全に透明になり)、ホットスポットは (0, 0) に設定されます。
そのことから、
w.setCursor( w.getToolkit().createCustomCursor( null, null, null ) );
トリックを行う必要があります。悲しいことに、コードで処理されないこのケースに関連するバグがあります。たとえば、 http://bugs.sun.com/bugdatabase/view_bug.do? bug_id=7150089を参照してください(これは MacOS 用ですが、ソースを参照することで、どのプラットフォームの実装にも最初のパラメータ値の有効性をチェックしていないことが簡単にわかるかもしれません;チェックImage
がありますが、この場合はそれが機能しません) 。Toolkit
tracker.isErrorAny()
null
Image
Mac OS で LWJGL を使用する場合は、次のようにする必要があります。
System.setProperty("apple.awt.fullscreenhidecursor","true");
frame.setCursor(frame.getToolkit().createCustomCursor(
new BufferedImage(3, 3, BufferedImage.TYPE_INT_ARGB), new Point(0, 0),
"null"));
ドキュメントでは、画像が無効な場合、デフォルトで透明になるため、空の画像を渡すと透明なカーソルになると書かれています。null
ただし、画像のメソッドに渡すと例外が発生します。
Toolkit tk= getToolkit();
Cursor transparent = tk.createCustomCursor(tk.getImage(""), new Point(), "trans");
私はこの問題をはるかに簡単に解決します:
final Timer cursorTimer = new Timer(2000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getContentPane().setCursor(null);
}
});
cursorTimer.start();
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
getGlassPane().setCursor(Cursor.getDefaultCursor());
cursorTimer.restart();
}
});