Непрерывное обновление всплывающей подсказки в Swing - PullRequest
3 голосов
/ 07 октября 2009

У меня есть собственный компонент Swing, который реализован аналогично JTree. Он имеет ComponentUI, который отображает список объектов с помощью CellRenderer. Подсказка теперь правильно отображается для каждой визуализированной ячейки, однако она не отслеживает мышь, как мне бы хотелось. Например, если у меня есть коробки, выложенные так:

 [ box A ]    [ box B ]   [ box C ]   [ box D ]

Если я перетащу мышь через эти поля, я увижу подсказку для поля A , где мышь пересекает границу поля A . Поскольку я продолжаю двигать мышь, подсказка не будет отслеживать указатель. Когда я покину поле, всплывающая подсказка исчезнет. Когда я пересекаю поле B , происходит то же самое.

Я предполагаю, что всплывающая подсказка обновляет представление только при изменении содержимого getToolTipText(MouseEvent event). Мне хотелось бы, чтобы подсказка отслеживала положение указателя независимо от содержимого, возвращаемого getToolTipText. Быстрый способ - добавить и удалить пустое пространство на основе четного / нечетного числа вызовов метода. Это работает, но, блин, не может быть так, как я должен это делать.

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

Ответы [ 2 ]

6 голосов
/ 07 октября 2009

Переопределить getToolTipLocation в визуализаторе вашей ячейки.

0 голосов
/ 24 июня 2010

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

После вставки точек останова выяснилось, что в таком коде:

public class DefinitionListCellRenderer extends JTextArea implements
        ListCellRenderer, ComponentListener {

...

    @Override
    public Point getToolTipLocation(MouseEvent event) {
        Point pt = new Point(event.getX(), event.getY());
        return pt;
    }


...

}

getToolTipLocation даже не вызывается !! Не могли бы вы сказать, почему? DefinitionListCellRenderer - это отдельный элемент в списке (имеет getListCellRendererComponent ()).

...