Вопрос

Я реализовал простой прослушиватель мыши, где цвет фона меняется всякий раз, когда мышь входит в компонент (JPanel), и он возвращается, когда мышь уходит. У этого есть некоторые проблемы:

  • Иногда мышь движется так быстро, что mouseexit Мероприятие не уволено
  • Если у моего компонента есть дети, когда мышь переходит к ребенку, это запускает mouseexit
  • Если я быстро переведу мышь к Чайцам, мыши Мероприятие не уволено

Я предполагаю, что это легко для ветеранов свинга. Есть предложения о том, как это исправить? Я бы хотел не использовать таймеры и тому подобное ...

Это было полезно?

Решение

Если я быстро переведу мышь к Чайцам, событие мышиного завода не уволено

Я никогда не видел, чтобы это произошло, но если это проблема, то вместо этого вы можете справиться с Mouseemoved, чтобы сбросить фон.

Если у моего компонента есть дети, когда мышь переходит к ребенку, это запускает MouseExit

Используйте следующий тест, и код будет выполнен только после того, как вы покидаете границы компонентов:

public void mouseExited(MouseEvent e) 
{
    if (! getVisibleRect().contains(e.getPoint()) )
    {
        setBackground(...);
    }
}

Другие советы

Есть несколько решений:

  • Добавьте слушателей мыши в детские компоненты. Также слушатели контейнеров, чтобы добавить и удалять слушателей, когда компоненты добавляются и удаляются. К сожалению, добавление слушателей мыши расстроило пузырьки событий мыши (отвратительный дизайн).
  • Добавьте стеклянную панель сверху. Это очень уродливое, и пересылка событий всегда вызывает проблемы.
  • Добавить AWTEventListener по умолчанию Toolkit и отфильтруйте для интересующих вас событий. К сожалению, это требует разрешения на безопасность.
  • Нажмите на обычай EventQueue и фильтрующие события. Это требует разрешения на безопасность, поместите аппеты, а приложения WebStart/JNLP получают это разрешение в любом случае.

Попробовав различные подходы на контейнере без успеха, я в итоге использовал Таймер. Анкет Это не помогло, что в моем контейнере содержались элементы, которые уже нуждались в слушателях мыши.

Подход таймера также означал, что я мог бы задержать изменения на короткое время. (В моем случае я показываю дополнительные кнопки в узле дерева (контейнер), а также изменяю фон.)

На MouseEnted () На контейнере Таймер создан (если нет уже там), который повторяется каждые 260 миллисекунд. На каждом вызове таймера он определяет, находится ли мышь внутри контейнера. Если это так, в первый раз это сигнализирует о мыше. Если нет, это сигнализирует о не мыши и останавливает таймер.

В Scala это следующее, когда метод вызывает intryexit () Кодирует, не закончилась ли мышь (где несколько вызовов с одинаковым значением не влияют на влияние):

abstract class MouseInterpreter(component: JComponent) extends MouseAdapter {
  ...
  private var mouseOverAction: () => Unit   = () => {}
  private var mouseOverTimer: Option[Timer] = None
  ...
  def entryExit(entered: Boolean) // this is an abstract method

  override def mouseEntered(e: MouseEvent) {
    if (mouseOverTimer.isEmpty) {
      val aTimer = new Timer(260, new ActionListener {
        def actionPerformed(e: ActionEvent) {
          mouseOverAction()
        }
      })
      mouseOverTimer = Some(aTimer)
      mouseOverAction = () => {
        mouseOverAction = () => {
          val point = MouseInfo.getPointerInfo.getLocation
          SwingUtilities.convertPointFromScreen(point, component)
          if (component.getVisibleRect.contains(point))
            entryExit(entered = true)
          else {
            entryExit(entered = false)
            aTimer.stop()
            mouseOverTimer = None
            mouseOverAction = () => {}
          }
        }
      }
      aTimer.setRepeats(true)
      aTimer.start()
    }
  }
...
}

Я не могу воспроизвести это поведение. Пожалуйста, отредактируйте свой вопрос, чтобы предоставить краткий код образец, который демонстрирует проблему.

Когда я создаю JPanel и вкладываю в нее что -то, JPanel не получает MouseExit, когда мышь перемещается по детскому компоненту JPanel. Я предполагаю, что вы добавили мышцам к детям.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top