将Java游标隐藏在屏幕上的任何位置

时间:2017-05-12 19:25:44

标签: java swing cursor

我希望将光标隐藏在x和y位置的特定范围内。下面是一些示例代码,代表我想要做的事情。

if(x >= xLowerBound && x <= xUpperBound + 600 && y >= yLowerBound + 20 && y <= yUpperBound + 600)
    setCursor(blankCursor);
else
    setCursor(Cursor.getDefaultCursor());

现在,我知道setCursor()可以应用于某个对象,这很好。但是,这对我的目的不起作用。

唯一的例外是,如果我能够以某种方式创建一个全屏不可见对象,我可以使用setCursor,尽管它是不可见的:

JFrame hiddenWindow = new JFrame();
hiddenWindow.setMaximumSize(Toolkit.getDefaultToolkit().getScreenSize());
hiddenWindow.setExtendedState(JFrame.MAXIMIZED_BOTH);

if(x >= xLowerBound && x <= xUpperBound && y >= yLowerBound && y <= yUpperBound)
    hiddenWindow.setCursor(blankCursor);
else
    hiddenWindow.setCursor(Cursor.getDefaultCursor());

(注意:这不起作用。)

重申一下,我需要能够在屏幕上的任何地方使用setCursor(),而不仅限于一个对象,除非我可以创建一个不可见的屏幕大小的对象来使用setCursor()

更新1:

我想我可以对自己所做的事做一点清楚。我在屏幕中央有一个主JFrame。它不占用整个屏幕。我将光标设置为空白光标,只要它离JFrameJFrame本身一定距离。但是,我不知道我会怎么做。

我的想法是,可能会使用占据整个屏幕的其他JFrame并且在其后面不可见,以便我可以setCursor()使用JFrame。对于它外面的空间。我希望这会更多地澄清这个问题。

1 个答案:

答案 0 :(得分:1)

您可以使用MouseMotionListener并覆盖其mouseMoved方法来检查鼠标的位置(在组件中)并相应地设置光标类型:

public class Test extends JFrame {

    Test() {
        final int x1 = 100, y1 = 100, x2 = 300, y2 = 300;

        BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
        Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(cursorImg, new Point(0, 0), "blank cursor");
        Cursor defaultCursor = new Cursor(Cursor.DEFAULT_CURSOR);

        addMouseMotionListener(new MouseAdapter() {

            @Override
            public void mouseMoved(MouseEvent e) {
                int x = e.getX();
                int y = e.getY();
                if (x > x1 && x < x2 && y > y1 && y < y2)
                    setCursor(blankCursor);
                else
                    setCursor(defaultCursor);
            }
        });

        setSize(new Dimension(400, 400));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test());
    }
}

感谢此answer获取空白光标的技巧。

您不能将光标设置在Java窗口之外。你可以选择一个看不见的全屏无头框架,但这很狡猾,也会拦截所有鼠标事件。实施将是相同的。

相关问题