Java: как большое количество MouseListeners соотносится с разделением пикселей/сетки?

Скажем, например, у вас есть список элементов или большая сетка компонентов, и вы хотите реализовать какой-то механизм наведения/ролловера. Самый простой способ сделать это — просто добавить MouseListener к каждому компоненту и использовать методы mouseEntered и mouseExited. Другой способ сделать это — определить компонент на основе местоположения мыши, например, у вас есть 2D-массив JLabels, и вы определяете, какая метка находится под указателем, используя что-то вроде:;

private void setRolloverIndices(Point p){
   this.rolloverRow = p.y / this.labelHeight;
   this.rolloverCol = p.x / this.labelWidth;
}

private JLabel getRolloverLabel(){
   // assume safe values
   return labels[rolloverRow][rolloverCol];
}

Стоит ли заморачиваться с вычислением пикселей/сетки, или слушатели вообще достаточно эффективны, чтобы обрабатывать множество компонентов?


person rtheunissen    schedule 17.12.2011    source источник


Ответы (1)


Один и тот же прослушиватель может быть добавлен к нескольким компонентам, а компонент, инициирующий событие, доступен с помощью getSource() или getComponent(). Не нужно гадать по расположению точки.

person JB Nizet    schedule 17.12.2011
comment
Я знаю, что один и тот же слушатель может быть добавлен ко многим компонентам. Но допустим, у вас есть один слушатель, прослушивающий многочисленные события (например, несколько прослушивателей мыши/клавиши/фокуса) на многих компонентах... конечно, если вы можете использовать вычисления, это будет намного эффективнее? Думаю, мой вопрос аналогичен тому, насколько эффективны слушатели в целом. - person rtheunissen; 17.12.2011
comment
слушатель — это просто объект, для которого вызывается метод, когда происходит какое-то событие. Его эффективность зависит от того, что он делает в этом методе. Один слушатель или несколько слушателей не изменят время, необходимое для выполнения данного метода. Все они вызываются последовательно, в уникальном потоке. - person JB Nizet; 17.12.2011