Добавление подсказок в JTextPane
Я хочу добавить несколько подсказок только к определенному тексту внутри JTextPane. Например, если внутри JTextPane есть текст ссылки, я хочу добавить подсказку к этому тексту, чтобы показать ссылку. Есть ли способ достичь этой функциональности?
4 ответов
хороший вопрос.
First Swing поддерживает HTML, поэтому, чтобы показать подсказку со ссылкой, вам просто нужно сказать:
comp.setToolTipText("<html><a href='http://www.google.com'>google</a></html>");
проблема в том, что эта подсказка кликабельна.
к сожалению, это не делается самим Swing.
подсказка создается ToolTipManager. При вызове setToolTipText () Jcomponent добавляет экземпляр самого себя в общий экземпляр Tooltip manager, который отвечает за отображение всплывающей подсказки (используя метод 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);
}
переопределение: метод getToolTipText(событие события mouseevent) в области текста.
с помощью MouseEvent вы можете использовать viewToModel(...) метод, чтобы получить offest в документ. Затем вы можете получить атрибуты, чтобы определить, зависаете ли вы над ссылкой.
или, возможно, более простой подход-использовать метод getCursor (). Когда курсор является курсором руки, вы находитесь над ссылкой.
затем вы можете вернуть соответствующий текст подсказки для текущего ссылка на сайт.
вы можете добавить TooltipText в JComponent, например JTextPane, а не в слова или части компонента.
обычно JTextPane может содержать несколько ссылок, поэтому для чего должен TooltipText показывать ссылку?
но вы можете добавить прослушиватель в JTextPane и удалить старую подсказку и добавить новую, если вы обнаружите ссылку.