Java 摆动步式光标移动

Java 摆动步式光标移动,java,swing,graphics,paintcomponent,mouselistener,Java,Swing,Graphics,Paintcomponent,Mouselistener,我有java swing国际象棋应用程序。光标具有自定义的视图矩形,大小适合整个单元格。我只需要在整个单元格上移动光标。不在一个单元格的范围内。这个问题有一些典型的解决方案吗?或者可以使用标准java功能设置步骤类型光标移动 我不会实现某种“步进”光标。相反,我会完全隐藏光标,并以编程方式突出显示当前单元格 隐藏光标签出 使用获取鼠标的移动(并在自定义组件的paintComponent方法中高亮显示) 下面“输出”此屏幕截图的完整示例: public class StepComponent

我有java swing国际象棋应用程序。光标具有自定义的视图矩形,大小适合整个单元格。我只需要在整个单元格上移动光标。不在一个单元格的范围内。这个问题有一些典型的解决方案吗?或者可以使用标准java功能设置步骤类型光标移动


我不会实现某种“步进”光标。相反,我会完全隐藏光标,并以编程方式突出显示当前单元格

  • 隐藏光标签出
  • 使用获取鼠标的移动(并在自定义组件的
    paintComponent
    方法中高亮显示)

下面“输出”此屏幕截图的完整示例:

public class StepComponent extends JComponent implements MouseMotionListener {
    private Point point = new Point(0, 0);

    public StepComponent() {
        setCursor(Toolkit.getDefaultToolkit().createCustomCursor(
                new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB), 
                new Point(0, 0), "blank cursor"));
        addMouseMotionListener(this);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        int x = 0, y = 0;
        while (x < getWidth()) { g.drawLine(x, 0, x, getHeight()); x += 10; }
        while (y < getHeight()) { g.drawLine(0, y, getWidth(), y); y += 10; }
        if (point != null)
            g.fillRect(point.x, point.y, 10, 10);
    }
    @Override public void mouseDragged(MouseEvent e) { update(e.getPoint()); }
    @Override public void mouseMoved(MouseEvent e) { update(e.getPoint()); }

    private void update(Point p) {
        Point point = new Point(10 * (p.x / 10), 10 * (p.y / 10));
        if (!this.point.equals(point)) {
            Rectangle changed = new Rectangle(this.point,new Dimension(10,10));
            this.point = point;
            changed.add(new Rectangle(this.point, new Dimension(10, 10)));
            repaint(changed);
        }
    }
}


这个评论编辑会杀了我…输入作品只是“完美”是的,谢谢。我以前尝试过这种解决方案,使用玻璃面板-我认为重新绘制大部分空白面板会更快,然后使用象棋桌重新绘制面板。主要问题是-性能。重新绘制方法需要大量资源。而且鼠标移动,尤其是在应用程序最大化时,会占用我所有的处理器时间。因此,w为什么我决定尝试使用自定义鼠标光标。应该不会花那么多时间,背景(在我的例子中是网格)总是可以绘制在
图像上。
。查看称为双缓冲的东西。。但这是另一个问题!;)我尝试了你的示例,即使没有绘制任何网格-只是光标矩形。在最大化窗口状态下,移动光标将100%加载我的处理器。据我所知-repaint()方法本身需要大量资源在我的系统中,此代码最多只使用3%(在我的2560x1440屏幕上最大化),然后我将鼠标移动到所有地方。;)
public static void main(String[] args) {

    JFrame frame = new JFrame("Test");

    frame.add(new StepComponent());

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 300);
    frame.setVisible(true);
}