如何在Java中改变光标图标?

neekobn8  于 2022-12-28  发布在  Java
关注(0)|答案(6)|浏览(183)

我想在Java应用程序执行时将光标图标更改为我定制的32x32图像。我查看并搜索了一下,我发现这些只是在JComponent上设置光标。但我希望光标在移动、浏览和单击时更改为我指定的图标,只要Java应用程序仍在运行,或者您可以说程序运行时。
非常感谢。

sqserrrh

sqserrrh1#

标准光标图像:

setCursor(Cursor.getDefaultCursor());

用户定义的图像:

Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image = toolkit.getImage("icons/handwriting.gif");
Cursor c = toolkit.createCustomCursor(image , new Point(mainPane.getX(), 
           mainPane.getY()), "img");
mainPane.setCursor (c);

您可以下载包含示例源代码的zip:HERE

aamkag61

aamkag612#

调用Component.setCursor。类Cursor作为一些预定义的游标。
可以创建自定义光标图像:

setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
new ImageIcon("custom.png").getImage(),
new Point(0,0),"custom cursor"));
aurhwmvo

aurhwmvo3#

尝试将光标设置在rootPane上。

frame.getRootPane().setCursor(...);
zynd9foi

zynd9foi4#

public void mouseEntered(MouseEvent e)
{
// set cursor for frame and its component
//  this is the current frame you are using .
//  You can change the this keyword with your frame name .

java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();
Image image = toolkit.getImage("/images/mousepoint.jpg");
Cursor a = toolkit.createCustomCursor(image , new Point(this.getX(),this.getY()), "");
this.setCursor (a);
}
bq3bfh9z

bq3bfh9z5#

为什么你没有一个类MyFrame来扩展JFrame。它所做的就是调用JFrame构造函数并将光标设置为你想要的光标。在我的应用程序中,我们有一个没有光标的触摸屏,所以这就是我打算如何实现它。

wz8daaqr

wz8daaqr6#

对于所问问题的直接答案(尽我所能),**不,您不能使用Java设置全局游标。**这在很大程度上取决于操作系统,但我认为,出于安全原因,在大多数(如果不是全部)安全操作系统上阻止设置全局游标。
然而,同样重要的是要触及一个方法,我认为会工作,但似乎不工作在我的系统,作为一个64位Windows 10专业版。
this answer的启发,你可以创建一个完全透明的窗口,将事件传递给它们后面的窗口(见下面的代码示例)。
现在,Window.setOpacity的定义表明这是一个依赖于平台的行为,但它具体是关于如何处理MouseEvent,而不是如何处理鼠标光标。然而,根据Windows Documentation,设置光标是基于一个特定的事件,所以我们需要控制哪些事件被传递。因此,这就变成了一个更低级的问题(很可能是C/C++),而不是Java问题。
下面是我为测试它而编写的代码示例:

JFrame frame = new JFrame();
    
    frame.setSize(1920, 1080);          // set the size
    frame.setLocationRelativeTo(null);  // center the window
    frame.setUndecorated(true);         // make it so the frame is a basic rectangle, no topbar or outline.
    frame.setAlwaysOnTop(true);         // make it so the frame is on top
    
    frame.setOpacity(0.0f);             // make the frame transparent.
    
    frame.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
    
    frame.setVisible(true);

如果将frame.setOpacity(0.0f);中的参数从0.0f设置为0到1之间的某个值,您将看到光标实际上发生了变化。
如果你想尝试一下原生语言并使用钩子(也许你不需要深入),也许可以开始here。每当我用C/C++(或任何其他低级语言)编程时,我倾向于让我的代码独立,从不使用WinAPI,也不依赖SDL这样的库,所以我并不精通这些系统级函数是如何工作的。
DR,在标准Java中,你不能这么做。低级选项可以工作。
我想你也可以制作自己的操作系统,甚至把它包含在Java中,这样你就不必在硬盘上安装一个全新的分区。

相关问题