【问题标题】:How to hide cursor in a Swing application?如何在 Swing 应用程序中隐藏光标?
【发布时间】:2010-12-31 08:12:50
【问题描述】:

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

当用户将鼠标指向 JFrame 中的 JPanel 外部时,我想隐藏光标。

【问题讨论】:

    标签: java swing mouse-cursor


    【解决方案1】:

    看来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 内的所有内容最终没有光标的评论,似乎JFrame 中包含的Components 最终将继承容器的光标(JFrame) , 所以如果要求某个Component 出现光标,则必须手动设置所需的光标。

    例如,如果JFrame 中包含JPanel,则可以使用Cursor.getDefaultCursor 方法将该JPanel 的光标设置为系统默认值:

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

    【讨论】:

    • 非常感谢Coobird的回答。但我还有另一个问题。我创建了包含 JPanel 的 JFrame,它的大小小于 JFrame。我只希望鼠标指向 JPanel 外部时光标消失。这是否意味着当我将主 JFrame 中的光标设置为不可见时,光标将在屏幕上完全消失?
    • 您好 Jessy,我在回答中添加了有关如何将 JPanel 设置为系统默认值的部分。
    • 嗨,我正在尝试在绘图方法中绘制鼠标光标...但我在线程“AWT-EventQueue-0”java.lang.IndexOutOfBoundsException:无效热点?有人知道这件事正在发生吗?
    【解决方案2】:

    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,但通过浏览源代码,您可能很容易发现在Toolkit 平台实现的任何中没有检查第一个参数Image 值有效性;有@ 987654328@ 检查,在这种情况下不起作用),因此传递 null 或无效 Image 只会引发 NPEx。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:
        frame.setCursor(frame.getToolkit().createCustomCursor(
                    new BufferedImage(3, 3, BufferedImage.TYPE_INT_ARGB), new Point(0, 0),
                    "null"));
        

        【讨论】:

          【解决方案5】:

          在文档中它说如果图像无效,则默认情况下它将是透明的,因此传递空图像将导致透明光标。但是将null 传递给图片的方法会导致异常。

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

          【讨论】:

            【解决方案6】:

            我更容易解决这个问题:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-10-02
              • 2014-07-19
              • 1970-01-01
              • 2018-06-04
              • 2014-10-18
              • 2017-06-07
              • 1970-01-01
              • 2013-09-21
              相关资源
              最近更新 更多