Я хочу добавить подсказки только к определенному тексту внутри JTextPane. Например, если в JTextPane есть ссылочный текст ссылки, я хочу добавить подсказку к этому тексту, чтобы показать ссылку. Есть ли способ достичь этой функциональности?
Добавление всплывающих подсказок в JTextPane
Ответ 1
Хороший вопрос.
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);
}
Ответ 2
Переопределить: getToolTipText (MouseEvent event) метод текстовой панели.
Используя MouseEvent, вы можете использовать метод viewToModel (...), чтобы попасть в документ. Затем вы можете получить атрибуты, чтобы определить, находитесь ли вы наведите указатель мыши на ссылку.
Или, может быть, более простой подход - использовать метод getCursor(). Когда курсор является ручным курсором, вы переходите по ссылке.
Затем вы можете вернуть соответствующий текст подсказки для текущей ссылки.
Ответ 3
Вы можете попробовать загрузить HTML-страницы в jtextpane. Вот пример. Подробнее об этом примере можно найти здесь
Ответ 4
Вы можете добавить TooltipText к JComponent, как JTextPane, а не к словам или частям Компонента.
Обычно JTextPane может содержать несколько ссылок, поэтому для чего должен отображаться ссылка TooltipText?
Но вы можете добавить Listener в JTextPane и удалить старую подсказку и добавить новую, если вы обнаружите ссылку.