Расширение ToolTipManager в Swing для изменения поведения при наведении?

Я хотел бы реализовать всплывающую подсказку в Swing с настраиваемым поведением: чем дольше пользователь наводит курсор на компонент, тем больше деталей должно отображаться во всплывающей подсказке (т. Е. После нескольких секунд наведения пользователя добавляется несколько новых строк над компонентом). Мне просто нужно проверить, действительно ли это выполнимо с Swing, без каких-либо проблем. Моя идея на данный момент, вероятно, будет:

  • Расширить ToolTipManager
  • Переопределите mouseEntered для запуска таймера (возможно, используйте javax.swing.Timer?). Вызовите setToolTipText и createToolTip, чтобы обновить всплывающую подсказку и регулярно добавлять новую информацию
  • Переопределить mouseExited для сброса таймера
  • Вероятно, используйте setDismissDelay, чтобы установить задержку отклонения намного дольше (или Integer.MAX_VALUE)

Это выполнимо или это не очень хороший способ работать с Swing (извините, я довольно новичок в этом)? Есть ли лучший способ сделать это?

[править] Хм, только что вспомнил, что ToolTipManager - это синглтон с конструктором, который имеет только видимость пакета, поэтому его нельзя расширять.

[править 2] Я сейчас пробую несколько решений. Одна вещь, которую я забыл добавить, это то, что мне нужно знать, над каким компонентом наведен курсор - что, я думаю, означает, что мне нужно будет работать с каким-то слушателем с помощью метода mouseEntered() (или иметь возможность получить доступ к этому Информация). И никакой другой интерактивности с всплывающим окном / всплывающей подсказкой не требуется - он просто должен отображать информацию.

2 ответа

Решение

(Это может показаться немного запутанным, поэтому дайте мне знать, если вам нужно, чтобы я разъяснил, дайте мне знать, и я постараюсь показать вам, как я рисую код). Я думаю, что ваша идея может работать так, как если бы вы ее расширили, а также сделать частный класс, который расширяется Threadа затем в run() метод вы делаете что-то вроде

while(true)
{
    sleep(1);
    timeElapsed++;
}

И в вашем классе, который распространяется ToolTipManagerсоздайте поле для этого класса, который расширяет Thread и в mouseEntered(MouseEvent e) создать такую ​​вещь, как:

extendsThreadClass = new ExtendsThreadClass();
extendsThreadClass.start();

а затем в mouseExited(MouseEvent e) метод сделать

extendsThreadClass = null;

Тогда в этом mouseEntered(MouseEvent e) метод после запуска Thread тогда вы можете делать то, что вы хотите сделать, после того, как время, как

if(timeElapsed > 3000)
{
   //what you want to do here
}

Извините, что это может сбить с толку, дайте мне знать, если я смогу прояснить это для вас

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

  • Расширить JToolTip
  • Используйте таймер Swing для синхронизации
  • Добавьте слушателя MouseMotion к JTree (в моем случае я хотел, чтобы всплывающее окно показывало, когда узел был наведен)
  • Несколько нелегко определить, когда указатель мыши двигался над узлом дерева, вот так:

    public void mouseMoved(MouseEvent e) {
    int x = (int) e.getX();
    int y = (int) e.getY();
    TreePath path = getPathForLocation(x, y);
    if (path == null) {
        tooltip.hide();
    } else {
        TreeNode node = (TreeNode) path.getLastPathComponent();
        tooltip.setHoveredNode(node); 
        if (!tooltip.isVisible) {
            int absX = e.getXOnScreen();
            int absY = e.getYOnScreen();
            final Popup tooltipContainer = PopupFactory.getSharedInstance().getPopup(PDTreeView.this, 
                    tooltip, absX, absY);
            tooltip.setToolTipContainer(tooltipContainer);
            tooltip.show();
        }
    }
    

    }

  • tooltip.show() относится к тому, как всплывающая подсказка содержалась во всплывающем окне, чтобы показать или скрыть ее программно. show() показывает всплывающее окно (и, следовательно, всплывающую подсказку), а также запускает таймер Swing.

  • Таймер имеет метод под названием actionPerformed() который вызывается с заданным интервалом. Мне только что этот метод вызвал код, который добавляет новую информацию в подсказку. в hide()Сбрасываю подсказку и таймер.

У меня были проблемы с тем, что всплывающее окно или всплывающая подсказка не менялись, чтобы соответствовать размеру содержимого, но в остальном это казалось нормальным

Другие вопросы по тегам