如何在Swing应用程序中隐藏光标?

时间:2009-12-31 05:34:19

标签: java swing cursor

有没有办法隐藏光标(除了使用透明图像作为光标)?

6 个答案:

答案 0 :(得分:65)

Cursor类似乎没有“空白”光标,因此可以使用Toolkit.createCustomCursor方法定义一个新的“空白”光标。

这是我试过的一种似乎有用的方法:

// 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,则可以使用Cursor.getDefaultCursor方法将JPanel的光标设置为系统的默认值:

JPanel p = ...
// Sets the JPanel's cursor to the system default.
p.setCursor(Cursor.getDefaultCursor());

答案 1 :(得分:6)

tl; dr AWT工具包在2017年仍然存在漏洞';因此,适当的解决方案是致电

  w.setCursor( w.getToolkit().createCustomCursor(
                   new BufferedImage( 1, 1, BufferedImage.TYPE_INT_ARGB ),
                   new Point(),
                   null ) );

代替。


根据Javadoc page for createCustomCursor

  

创建一个新的自定义光标对象。        如果要显示的图像无效,则将隐藏光标(制作        完全透明),热点将设置为(0,0)。

它将遵循那个

w.setCursor( w.getToolkit().createCustomCursor( null, null, null ) );

应该做的伎俩。遗憾的是,有一个与此案例相关的错误未由代码处理,请参阅例如http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7150089(特别适用于MacOS,但通过浏览来源,您可能很容易发现{{1}的任何中没有检查第一个参数Image值的有效性}平台实现;有Toolkit检查,在这种情况下不做它的工作),所以传递tracker.isErrorAny()或无效null只会抛出NPEx。

答案 2 :(得分:3)

在Mac OS下使用LWJGL时,您需要这样做:

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

答案 3 :(得分:3)

frame.setCursor(frame.getToolkit().createCustomCursor(
            new BufferedImage(3, 3, BufferedImage.TYPE_INT_ARGB), new Point(0, 0),
            "null"));

答案 4 :(得分:2)

在文档中它说如果图像无效,那么它默认是透明的,因此传递空图像将产生透明光标。但是将null传递给图像的方法将导致异常。

Toolkit tk= getToolkit();
Cursor transparent = tk.createCustomCursor(tk.getImage(""), new Point(), "trans");

答案 5 :(得分:1)

我更容易解决这个问题:

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