2009-08-26 2 views
0

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

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

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

Цифры рисуются на 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)); 
     } 
    } 

ответ

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); 
    } 
} 
2

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

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

+0

Хорошо, я буду редактировать этот вопрос и разместить код. – Hans

5

Более эффективным подходом было бы добавить ребенка 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); 
+0

Я думаю, что это был бы способ сделать это, но мне нужно было бы изменить весь рисунок. – Hans

+0

Хмм, или я все еще мог нарисовать фигуры на главной панели, и когда выбрана «Кнопка подключения», каждая видимая видимая область видится. – Hans