Добавление всплывающих подсказок в JTextPane - PullRequest
10 голосов
/ 03 июля 2011

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

Ответы [ 4 ]

8 голосов
/ 03 июля 2011

Хороший вопрос.

First Swing поддерживает HTML, поэтому, чтобы показать всплывающую подсказку со ссылкой, нужно просто сказать:

comp.setToolTipText("<html><a href='http://www.google.com'>google</a></html>");

Проблема заключается в создании этой подсказкикликабельны.

К сожалению, это не сделано самим Swing.

Всплывающая подсказка создается ToolTipManager.Когда вы вызываете setToolTipText (), Jcomponent добавляет свой экземпляр к общему экземпляру диспетчера подсказок, который отвечает за отображение всплывающей подсказки (используя метод show(), который не может быть переопределен. Вы также не можете изменить сам диспетчер подсказок.

Итак, лучшее решение, которое я могу предложить, это сделать следующее: вы можете прослушивать события AWT, используя Toolkit.getDefaultToolkit().addAWTEventListener()

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

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

    public static void main(String[] args) throws InterruptedException, InvocationTargetException {
        final JFrame f = new JFrame("test");
        f.setSize(100, 100);


        JLabel l = new JLabel("<html><a href='http://www.google.com'>google</a></html>");
        l.setToolTipText("<html><a href='http://www.google.com'>google</a></html>");


        long mask = AWTEvent.COMPONENT_EVENT_MASK |
//      AWTEvent.CONTAINER_EVENT_MASK |
//      AWTEvent.FOCUS_EVENT_MASK |
//      AWTEvent.KEY_EVENT_MASK |
//      AWTEvent.MOUSE_EVENT_MASK |
//      AWTEvent.MOUSE_MOTION_EVENT_MASK |
        AWTEvent.WINDOW_EVENT_MASK |
        AWTEvent.ACTION_EVENT_MASK |
        AWTEvent.ADJUSTMENT_EVENT_MASK |
        AWTEvent.ITEM_EVENT_MASK |
        AWTEvent.TEXT_EVENT_MASK;

        Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
            @Override
            public void eventDispatched(AWTEvent event) {
                int id = event.getID();
                Object source = event.getSource();
                if (id == 101 && source instanceof JToolTip) {
                    JToolTip tooltip = (JToolTip)source;

                    //System.out.println("" + event.getID() + " " + event.getSource());

                }

            }
        }, mask);
        f.add(l);
        f.setVisible(true);
    }
6 голосов
/ 03 июля 2011

Переопределение: метод getToolTipText (событие MouseEvent) текстовой панели.

Используя MouseEvent, вы можете использовать метод viewToModel (...), чтобы получить доступ к документу. Затем вы можете получить атрибуты, чтобы определить, находитесь ли вы над ссылкой.

Или, возможно, более простой подход - использовать метод getCursor (). Когда курсор является ручным курсором, вы находитесь над ссылкой.

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

2 голосов
/ 03 июля 2011

Вы можете попробовать загрузить HTML-страницы в jtextpane. Здесь является примером.Более подробное объяснение этого примера можно найти здесь

1 голос
/ 03 июля 2011

Вы можете добавить TooltipText к JComponent, как JTextPane, а не к словам или частям Компонента.

Обычно JTextPane может содержать несколько ссылок, поэтому для чего в TooltipText должна отображаться ссылка?

Но вы можете добавить прослушиватель в JTextPane, удалить старую подсказку и добавить новуюодин, если вы обнаружите ссылку.

...