5

私は Java で単純な 2D ゲーム エンジンに取り組んでおり、FSEM やバッファ戦略などに問題はありません。私の問題はマウスカーソルにあります。ウィンドウ モードでは、JFrame から setCursor() を使用して完全に透明なカーソルを設定することで、問題なくマウス カーソルを非表示にできます。ただし、device.setFullScreenWindow(this) を呼び出して FSEM に入ると、マウス カーソルが戻ってきて、その後 setCursor() を呼び出して空のカーソルに戻しても効果がありません。device.setFullScreenWindow(null) を呼び出すと、カーソルを再び取り除くことができます。カーソルを取り除くことができないのは、FSEM にいるときだけです。

私は JDK 6 で作業しています。ターゲット プラットフォームは JDK 5+ です。

更新:さらにテストを行ったところ、この問題は MacOS X 10.5 w/Java 6u7 では発生するようですが、Windows XP SP3 with Java 6u7 では発生しないようです。そのため、Mac バージョンの JVM のバグである可能性があります。

4

7 に答える 7

11

カスタムの非表示カーソルを作成してみてください。

    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Point hotSpot = new Point(0,0);
    BufferedImage cursorImage = new BufferedImage(1, 1, BufferedImage.TRANSLUCENT); 
    Cursor invisibleCursor = toolkit.createCustomCursor(cursorImage, hotSpot, "InvisibleCursor");        
    setCursor(invisibleCursor);
于 2010-11-10T04:21:07.530 に答える
5

ある開発者は、透明な GIF から 1 ピクセルのカーソルを作成することで、この問題を回避する方法を見つけました。

http://sevensoft.livejournal.com/23460.html

あなたがそれを試したことは知っていますが、彼はあなたが言うようにフルスクリーンモードの問題に具体的に取り組んでいるので、あなたがしていないことを彼がやっている可能性があります.

于 2008-10-10T16:12:37.677 に答える
4

私は最終的に解決策を見つけたと思います:

System.setProperty("apple.awt.fullscreenhidecursor","true");

これは、アプリケーションがフルスクリーン モードのときにマウス カーソルを非表示にする Apple 独自のシステム プロパティです。それを修正するために私が見つけた唯一の方法です。

于 2008-10-15T17:42:13.547 に答える
1

これが私のために働いているものです:

Toolkit toolkit = Toolkit.getDefaultToolkit();

// get the smallest valid cursor size
Dimension dim = toolkit.getBestCursorSize(1, 1);

// create a new image of that size with an alpha channel
BufferedImage cursorImg = new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_INT_ARGB);

// get a Graphics2D object to draw to the image
Graphics2D g2d = cursorImg.createGraphics();

// set the background 'color' with 0 alpha and clear the image
g2d.setBackground(new Color(0.0f, 0.0f, 0.0f, 0.0f));
g2d.clearRect(0, 0, dim.width, dim.height);

// dispose the Graphics2D object
g2d.dispose();

// now create your cursor using that transparent image
hiddenCursor = toolkit.createCustomCursor(cursorImg, new Point(0,0), "hiddenCursor");

確かに、私は (まだ) Mac ではテストしておらず、Windows だけでテストしています。しかし、一般的な方法を使用すると、カーソルがブラック ボックスとして取得されたので、上記のコードを使用して透明なボックスを作成し、代わりにカーソルとして設定します。もちろん、AWT オブジェクト (アプリのフレームなど) で setCursor メソッドを使用して、この hiddenCursor を設定する必要があります。これが私のhideMouseメソッドです(「fr」は私のフレームです):

public void hideMouse(boolean hide) {
    if(hide) {
        fr.setCursor(hiddenCursor);
    } else {
        fr.setCursor(Cursor.getDefaultCursor());
    }
}
于 2009-06-22T16:21:16.883 に答える
0

Windowsでのみ実行している場合は、JNIを介してShowCursor(FALSE)を呼び出す必要があるようです。少なくとも、カーソルを完全に非表示にするため。

1x1カーソルを作成するコードを次に示します。私はまだ1x1カーソルを取得していますが、それは私にとってはうまくいきます。

 Toolkit toolkit = Toolkit.getDefaultToolkit();
 Dimension dim = toolkit.getBestCursorSize(1,1);
 transCursor = toolkit.createCustomCursor(gc.createCompatibleImage(dim.width, dim.height),
     new Point(0, 0), "transCursor");
 ((Component)mainFrame).setCursor(transCursor);
于 2008-10-10T19:55:52.203 に答える
0

特にMacの問題については、JNIを介して次を使用できます。

Quartz Display Services リファレンス - CGDisplayHideCursor

于 2008-10-10T20:43:51.733 に答える
0

この知識が当てはまるかどうかはわかりませんが、古いVB6アプリでは同じ問題があり、カーソルを画面の外に移動して非常に大きな値を与えることを取り除きました。
それが役に立てば幸い。

于 2008-10-10T14:37:04.907 に答える