【问题标题】:How to track cursor position efficiently in Java?如何在 Java 中有效地跟踪光标位置?
【发布时间】:2009-08-26 05:02:44
【问题描述】:

我一直在尝试创建的效果是鼠标光标图标在鼠标进入 JPanel 上的某个区域时会发生变化,并且在离开该区域时切换到默认值。我在 MouseMotionListener 类中使用了 MouseMoved 功能,每当鼠标移到 JPanel 上时,它都会验证坐标是否对应于特殊区域。

但是,这种方法对计算机处理器的压力非常大,所以我想问一下是否有更有效的方法。任何帮助表示赞赏。

What the program does is it draws figures on a JPanel, and when the Connection button is selected then it connects those figures with a line if the user clicks on one figure, and then on another.

这些图形是在 JPanel 上绘制的,并存储了它们各自的区域边界,因此当鼠标移动时,它会检查当前的 X 和 Y 坐标是否在这些区域之一内,如果是,则更改光标。 checkValidConnectionRegion 检查当前 X 和 Y 变量是否在图形区域内。这是处理程序的代码:

public void mouseMoved(MouseEvent e)
    {
        if(GUI.Connectionbutton.isSelected())
        {
            x = e.getX();
            y = e.getY();

            checkValidConnectionRegion(); 

            if(validConnectionRegion)
                setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
            if(!validConnectionRegion)
                setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
        }
    }

【问题讨论】:

    标签: java mouse move onmousemove


    【解决方案1】:

    更有效的方法是将子JPanel 添加到父JPanel,这将充当不可见区域。然后只需将光标设置在子 JPanel 上,当您移到它上面时鼠标指针应该会发生变化。

    JPanel mainPnl = new JPanel(new BorderLayout());
    
    JPanel invisibleArea = new JPanel();
    invisibleArea.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    invisibleArea.setPreferredSize(new Dimension(100, 100));
    
    mainPnl.add(invisibleArea, BorderLayout.WEST);
    

    【讨论】:

    • 我认为这是一种方法,但我需要改变绘制图形的整个方式。
    • hmm,或者我仍然可以在主面板上绘制数字,并且选择“连接按钮”设置每个不可见区域可见。 span>
    【解决方案2】:

    我不熟悉 Java,但问题可能是 Cursor.getPredefinedCursor 每次调用它时都会创建一个新的游标实例。 (不知道是不是真的)

    尝试在你的类中为两个光标创建两个 final 字段,并且只设置一次。

    另外,如果validConnectionRegion 实际发生变化,请尝试仅定位光标。

    例如:

    final Cursor crosshairCursor = Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR);
    final Cursor defaultCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
    
    public void mouseMoved(MouseEvent e)
    {
        if(GUI.Connectionbutton.isSelected())
        {
            x = e.getX();
            y = e.getY();
    
            boolean wasValid = validConnectionRegion;
            checkValidConnectionRegion(); 
    
            if(wasValid != validConnectionRegion)
                setCursor(validConnectionRegion ? crosshairCursor : defaultCursor);
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可能在 MouseMoved 处理程序中运行效率低下的代码。

      您能否发布 MouseMoved 处理程序的完整源代码?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-08
        • 1970-01-01
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 2020-01-15
        • 2015-01-27
        相关资源
        最近更新 更多