Как изменить таймеры jtooltip для 1 компонента - PullRequest
4 голосов
/ 13 марта 2010

У меня есть компонент, в котором я хочу отобразить пользовательский jtooltip. Это легко, просто измените метод getTooltip. Аналогично для местоположения и текста.

Однако я также хочу изменить таймеры. Всплывающая подсказка всегда должна отображаться, если указатель мыши находится над ячейкой компонента. Если он оставляет все это, он должен стать невидимым. Я знаю, что могу использовать TooltipManager для контроля времени во всем мире. Но лучшее решение, вероятно, состоит в том, чтобы просто сократить это и отобразить подсказку самостоятельно с помощью мыши. Однако, когда я попытался сделать это (отменить регистрацию компонента в TooltipManager и установить подсказку видимой, с текстом и в правильном положении, в слушателе мыши), подсказка вообще не показывалась. Что я делаю не так?

Edit: Теперь вопрос изменился! На 2 вопроса.

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

    private Popup lastPopup;
    private final JToolTip tooltip = ...;
    private Point lastPoint;
   @Override public void mouseMoved(MouseEvent e) {
        Point p = privateToolTipLocation(e);
        if (p == null || p.equals(lastPoint)) {
            return;
        }
        lastPoint = p;
        tooltip.setTipText(privateToolTipText(e));
        //copy
        p = new Point(p);
        SwingUtilities.convertPointToScreen(p, this);
        Popup newPopup = PopupFactory.getSharedInstance().getPopup(this, tooltip, p.x, p.y);
        if (lastPopup != null) {
            lastPopup.hide();
        }
        lastPopup = newPopup;
        newPopup.show();
    }

    @Override public void mouseExited(MouseEvent e) {
        if (lastPopup != null && someUnknownCondiction) {
            lastPopup.hide();
            lastPopup = null;
        }
    }

Ответы [ 3 ]

7 голосов
/ 13 марта 2010

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

Вот пример кода:

instantTooltipComponent.addMouseListener(new MouseAdapter() 
{    
    final int defaultTimeout = ToolTipManager.sharedInstance().getInitialDelay();

    @Override
    public void mouseEntered(MouseEvent e) {
        ToolTipManager.sharedInstance().setInitialDelay(0);
    }

    @Override
    public void mouseExited(MouseEvent e) {
        ToolTipManager.sharedInstance().setInitialDelay(defaultTimeout);
    }
});

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

4 голосов
/ 13 марта 2010

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

Вызовите действие по умолчанию для компонента для отображения всплывающей подсказки:

Action toolTipAction = component.getActionMap().get("postTip");

if (toolTipAction != null)
{
    ActionEvent postTip = new ActionEvent(component, ActionEvent.ACTION_PERFORMED, "");
    toolTipAction.actionPerformed( postTip );
}

Edit:

Выше код больше не работает. Ctrl + F1 - это комбинация клавиш по умолчанию, используемая для отображения всплывающей подсказки компонента. Таким образом, альтернативный подход заключается в отправке сочетания клавиш Ctrl + F1 на компонент. Например:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PostTipSSCCE2 extends JPanel
{
    public PostTipSSCCE2()
    {
        FocusAdapter fa = new FocusAdapter()
        {
            public void focusGained(FocusEvent e)
            {
                JComponent component = (JComponent)e.getSource();

                KeyEvent ke = new KeyEvent(
                    component,
                    KeyEvent.KEY_PRESSED,
                    System.currentTimeMillis(),
                    KeyEvent.CTRL_MASK,
                    KeyEvent.VK_F1,
                    KeyEvent.CHAR_UNDEFINED);

                component.dispatchEvent( ke );
            }
        };

        MouseAdapter ma = new MouseAdapter()
        {
            @Override
            public void mouseEntered(MouseEvent e)
            {
                JComponent component = (JComponent)e.getSource();

                KeyEvent ke = new KeyEvent(
                    component,
                    KeyEvent.KEY_PRESSED,
                    System.currentTimeMillis(),
                    KeyEvent.CTRL_MASK,
                    KeyEvent.VK_F1,
                    KeyEvent.CHAR_UNDEFINED);

                component.dispatchEvent( ke );
            }
        };

        JButton button = new JButton("Button");
        button.setToolTipText("button tool tip");
        button.addFocusListener( fa );
        button.addMouseListener( ma );
        add( button );

        JTextField textField = new JTextField(10);
        textField.setToolTipText("text field tool tip");
        textField.addFocusListener( fa );
        textField.addMouseListener( ma );
        add( textField );

        JCheckBox checkBox =  new JCheckBox("CheckBox");
        checkBox.setToolTipText("checkbox tool tip");
        checkBox.addFocusListener( fa );
        checkBox.addMouseListener( ma );
        add( checkBox );
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("PostTipSSCCE2");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new JScrollPane(new PostTipSSCCE2()) );
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
0 голосов
/ 13 марта 2010

Очевидно, что управляет отображением подсказки, если getTooltipText возвращает ноль или нет. Имея это к нулю, устранил npe и позволил вещам отображаться. Однако есть еще артефакты ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...