Pergunta

Eu estou trabalhando em um simples motor de jogo 2D em Java, e não ter problemas com FSEM, tampão estratégias, e assim por diante; meu problema é com o cursor do mouse. No modo de janela, posso ocultar o cursor do mouse, não há problema, usando setCursor () do meu JFrame para definir um cursor totalmente transparente. No entanto, após uma chamada para device.setFullScreenWindow (this) para entrar em FSEM, o cursor do mouse volta, e as chamadas subseqüentes para setCursor () para configurá-lo de volta para minha em branco cursor não têm nenhum efeito. Chamando device.setFullScreenWindow (null) me permite livrar-se do cursor novamente -. É só enquanto eu estou em FSEM que eu não posso me livrar dele

Eu estou trabalhando sob JDK 6, plataforma de destino é JDK 5 +.

UPDATE: eu fiz mais alguns testes, e parece que este problema ocorre no MacOS X 10.5 w / Java 6u7, mas não no Windows XP SP3 com 6u7 Java. Assim, ele poderia ser um bug na versão Mac do JVM.

Foi útil?

Solução 3

Eu acho que finalmente encontrou a solução:

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

Esta é uma propriedade do sistema da Apple-proprietária que esconde o cursor do mouse quando um aplicativo está em modo de tela cheia. É a única maneira que eu encontrei para corrigi-lo.

Outras dicas

Tente criar um cursor invisível personalizado:

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

Um desenvolvedor encontrou uma maneira de contornar isso criando um cursor um pixel para fora de um GIF transparente.

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

Eu sei que você tentou isso, mas o seu é especificamente abordar a questão do modo de tela cheia, exatamente como você diz, então talvez há algo que ele fez que você não tem.

Aqui está o que tem trabalhado para mim:

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

Com certeza, eu não testei no Mac (ainda), apenas o Windows. Mas quando eu usei os métodos comuns que eu estava recebendo o cursor como caixa preta, então eu uso o código acima a criar uma caixa transparente e defini-lo como o cursor em vez. Claro que você tem que usar o método setCursor em um objeto AWT (como quadro do seu aplicativo) para definir essa hiddenCursor. Aqui é o meu método hideMouse ( 'fr' é o meu Frame):

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

Eu não sei se esse conhecimento se aplica, mas em um aplicativo VB6 velho eu tive o mesmo problema e eu me livrei dele movendo o cursor para fora da tela dando-lhe alguns valores muito grandes.
Espero que ajude.

Se você estiver executando apenas no Windows, parece que você vai precisar para chamar ShowCursor (FALSO) através de JNI. Pelo menos, para fazer o cursor esconder completa.

Aqui está um código que cria o cursor 1x1. Ele funciona para mim, embora eu ainda obter um cursor 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);

Especificamente para o seu problema Mac, através de JNI você poderia usar o seguinte:

Quartz exibir Serviços de Referência - CGDisplayHideCursor

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top