我必须通过添加自定义光标来更新旧版Java小程序,该光标在将鼠标移动到Panel的某些区域时出现。我已经完成了它并且它可以工作,除了如果光标位置移动到我的面板的左边或底部(显示调整大小箭头光标)然后移动到自定义光标区域,如果光标快速移动则显示自定义光标,但如果移动缓慢,则会显示默认光标。
如果我使用预定义的游标,问题就会消失,但不幸的是我需要一个移动光标,这是在Mac上运行的,通常的移动光标不可用。
有什么想法吗?下面的示例代码,虽然您需要获取自己的光标png文件 - 像这样的人https://i.stack.imgur.com/gJmeJ.png(感谢@Andrew Thompson)
Runner.java:
import java.applet.Applet;
import java.awt.Frame;
import java.awt.Panel;
public class Runner extends Applet
{
public void init()
{
//Create and set up the window.
Panel testpanel = new TestPanel();
Frame frame = new Frame();
frame.add(testpanel);
frame.pack();
frame.setVisible(true);
}
}
TestPanel.java:
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class TestPanel extends Panel
implements MouseMotionListener, MouseListener
{
private Cursor dragCursor;
public TestPanel()
{
setPreferredSize(new Dimension(500, 200));
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image = toolkit.getImage("dragcursor.png");
dragCursor = toolkit.createCustomCursor(image ,new Point(16, 16), "img");
addMouseMotionListener(this);
addMouseListener(this);
}
@Override
public void mouseEntered(MouseEvent evt)
{
}
@Override
public void mouseExited(MouseEvent evt)
{
}
@Override
public void mouseClicked(MouseEvent evt)
{
if (evt.getX() > 0 && evt.getX() < 300 && evt.getY() > 0
&& evt.getY() < 300)
{
// display drag cursor at mouse position
this.getParent().setCursor(dragCursor);
}
else
{
// reset cursor
this.getParent()
.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
@Override
public void mouseMoved(MouseEvent evt)
{
if (evt.getX() > 0 && evt.getX() < 300 && evt.getY() > 0
&& evt.getY() < 300)
{
// display drag cursor at mouse position
this.getParent().setCursor(dragCursor);
}
else
{
// reset cursor
this.getParent()
.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
@Override
public void mousePressed(MouseEvent evt)
{
}
@Override
public void mouseReleased(MouseEvent evt)
{
}
@Override
public void mouseDragged(MouseEvent evt)
{
}
@Override
public void paint(Graphics g)
{
g.setColor(Color.red);
g.drawRect(0, 0, 300, 300);
}
}