Code
JEditorPane hint = new JEditorPane();
hint.setEditorKit(new HTMLEditorKit());
hint.setEditable(false);
hint.setOpaque(false);
JCheckBox check = new JCheckBox();
check.setOpaque(false);
JPanel panel = new JPanel(new BorderLayout());
panel.add(hint);
panel.add(check, BorderLayout.EAST);
JPopupMenu popup = new JPopupMenu();
popup.add(new JScrollPane(panel));
popup.setBorder(BorderFactory.createEmptyBorder());
JEditorPane editor = new JEditorPane() {
@Override public JToolTip createToolTip() {
JToolTip tip = super.createToolTip();
tip.addHierarchyListener(e -> {
if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0
&& e.getComponent().isShowing()) {
panel.setBackground(tip.getBackground());
popup.show(tip, 0, 0);
}
});
return tip;
}
};
editor.setEditorKit(new HTMLEditorKit());
editor.setText(HTML_TEXT);
editor.setEditable(false);
editor.addHyperlinkListener(e -> {
JEditorPane editorPane = (JEditorPane) e.getSource();
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
JOptionPane.showMessageDialog(editorPane, "You click the link with the URL " + e.getURL());
} else if (e.getEventType() == HyperlinkEvent.EventType.ENTERED) {
editorPane.setToolTipText("");
Optional.ofNullable(e.getSourceElement())
.map(elem -> (AttributeSet) elem.getAttributes().getAttribute(HTML.Tag.A))
.ifPresent(attr -> {
String title = Objects.toString(attr.getAttribute(HTML.Attribute.TITLE));
String url = Objects.toString(e.getURL());
// String url = Objects.toString(attr.getAttribute(HTML.Attribute.HREF));
hint.setText(String.format("%s: %s", title, url, url));
popup.pack();
});
} else if (e.getEventType() == HyperlinkEvent.EventType.EXITED) {
editorPane.setToolTipText(null);
}
});
- Override
JComponent#createToolTip()
method to add HierarchyListener
to JToolTip
- Show
JPopupMenu
with JToolTip
as parent when JToolTip
is visible
JToolTip
hides behind JPopupMenu
JPopupMenu
adds a JPanel
with a JEditorPane
and a JCheckBox
instead of a JMenuItem
- Hiding the parent
JToolTip
with the mouse cursor does not close the JPopupMenu
, so you can click the internal JCheckBox
or select the text in the JEditorPane
and copy it with Ctrl-C, etc
- It is a normal
JPopupMenu
, so it is hidden when the focus is moved by clicking on the parent JFrame
etc
References
No comments:
Post a Comment