在屏幕任意位置隐藏 Java 光标
Hide Java cursor at any place on the screen
我希望在特定的 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
。它不会占据整个屏幕。只要光标距离 JFrame
一定距离或在 JFrame
内部,我就会将光标设置为空白光标。但是,我不知道该怎么做。
我的想法是也许使用另一个 JFrame
占据整个屏幕并且在它后面是不可见的,这样我就可以在那个 JFrame
上使用 setCursor()
。对于它外面的space。我希望这能进一步澄清问题。
您可以使用 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 window 之外。你可以按照你的想法去做一个不可见的、全屏的、无头的框架,但这很不可靠,而且还会拦截所有的鼠标事件。实施将是相同的。
我希望在特定的 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
。它不会占据整个屏幕。只要光标距离 JFrame
一定距离或在 JFrame
内部,我就会将光标设置为空白光标。但是,我不知道该怎么做。
我的想法是也许使用另一个 JFrame
占据整个屏幕并且在它后面是不可见的,这样我就可以在那个 JFrame
上使用 setCursor()
。对于它外面的space。我希望这能进一步澄清问题。
您可以使用 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 window 之外。你可以按照你的想法去做一个不可见的、全屏的、无头的框架,但这很不可靠,而且还会拦截所有的鼠标事件。实施将是相同的。