sclass CustomToolTip { JComponent target; JWindow window; swappable JComponent makeContent(); *(IF0 *makeContent) {} /*void setContent(JComponent content) { setWindowContents(window, content); }*/ // run in Swing thread void move { if (window == null) ret; var mouse = mouseLocationOnScreen(); window.setLocation(mouse.x+10, mouse.y+10); } // run in Swing thread void showOrMove { if (window != null) ret with move(); window = new JWindow; window.pack(); unswing; var content = makeContent(); swing { setWindowContents(window, content); move(); showWindow(window); } } void hide swing { disposeWindow(window); window = null; } void installOn(JComponent target) { this.target = target; target.addMouseMotionListener(new MouseMotionAdapter { @Override public void mouseEntered(MouseEvent e) { showOrMove(); } @Override public void mouseExited(MouseEvent e) { hide(); } @Override public void mouseMoved(MouseEvent e) { showOrMove(); } @Override public void mousePressed(MouseEvent e) { hide(); } }); } }