Как эффективно отслеживать положение курсора в Java? - PullRequest
0 голосов
/ 26 августа 2009

Эффект, который я пытался создать, состоит в том, что значок курсора мыши изменяется всякий раз, когда мышь входит в определенную зону на JPanel, и переключается на значение по умолчанию при каждом выходе из зоны. Я использую функцию MouseMoved в классе MouseMotionListener, которая всякий раз, когда мышь перемещается над JPanel, проверяет, соответствуют ли координаты специальной области.

Однако при использовании этого метода нагрузка на процессор компьютера очень высока, поэтому я хотел спросить, есть ли более эффективный способ сделать это. Любая помощь приветствуется.

Что программа делает, так это рисует фигуры на JPanel, а когда выбрана кнопка «Соединение», она связывает эти фигуры с линией, если пользователь нажимает на одну фигуру, а затем на другую.

Фигуры нарисованы на 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));
        }
    }

Ответы [ 3 ]

5 голосов
/ 26 августа 2009

Более эффективный подход заключается в добавлении дочернего элемента 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);
2 голосов
/ 27 августа 2009

Я не знаком с 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);
    }
}
2 голосов
/ 26 августа 2009

Возможно, вы используете неэффективный код в вашем обработчике MouseMoved.

Можете ли вы опубликовать весь исходный код для вашего обработчика MouseMoved?

...