全画面専用モードでマウスカーソルを削除するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/191592

質問

私は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で発生するようですが、Java 6u7を搭載したWindows XP SP3では発生しないようです。したがって、MacバージョンのJVMのバグである可能性があります。

役に立ちましたか?

解決 3

ようやく解決策を見つけたと思います:

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

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

他のヒント

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

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

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

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

あなたがそれを試したことは知っていますが、彼はあなたが言うようにフルスクリーンモードの問題に特に取り組んでいるので、おそらく彼がやったことではないことがあります。

これは私のために働いてきたものです:

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でのみテストしています。しかし、一般的な方法を使用したときは、カーソルをブラックボックスとして取得していたため、上記のコードを使用して透明なボックスを作成し、代わりにカーソルとして設定しました。もちろん、このhiddenCursorを設定するには、AWTオブジェクト(アプリのフレームなど)でsetCursorメソッドを使用する必要があります。ここに私のhideMouseメソッドがあります(「fr」は私のフレームです):

public void hideMouse(boolean hide) {
    if(hide) {
        fr.setCursor(hiddenCursor);
    } else {
        fr.setCursor(Cursor.getDefaultCursor());
    }
}

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

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

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

クォーツディスプレイサービスリファレンス-CGDisplayHideCursor

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top