全画面専用モードでマウスカーソルを削除するにはどうすればよいですか?
-
08-07-2019 - |
質問
私は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を介して以下を使用できます。