void (MouseEvent e) { if (cellComponentProvider != null) { JComponent cellRenderer = cellComponentProvider.getCellRendererComponent(e); ValidationInfo info = cellRenderer != null ? (ValidationInfo)cellRenderer.getClientProperty(ValidatingTableCellRendererWrapper.CELL_VALIDATION_PROPERTY) : null; if (info==null && cellRenderer instanceof ExpandedItemRendererComponentWrapper wrapper) { Component unwrapped = ExpandedItemRendererComponentWrapper.unwrap(wrapper); if (unwrapped instanceof JComponent unwrappedCellRenderer) { info = (ValidationInfo)unwrappedCellRenderer.getClientProperty(ValidatingTableCellRendererWrapper.CELL_VALIDATION_PROPERTY); } } if (info != null) { if (!info.equals(validationInfo)) { validationInfo = info; closeWithDelay = hasATag(validationInfo.message); popupBuilder = ComponentValidator.createPopupBuilder(validationInfo, tipComponent -> { if (closeWithDelay) { tipComponent.addHyperlinkListener(hyperlinkListener); tipComponent.addMouseListener(new TipComponentMouseListener()); } popupSize = tipComponent.getPreferredSize(); }).setCancelOnMouseOutCallback(me -> me.getID() == MouseEvent.MOUSE_PRESSED && !ComponentValidator.withinComponent(validationInfo, me) && (cellRect == null || !cellRect.contains(me.getPoint()))); hidePopup(false, () -> showPopup(e)); } else if (!isShowing()) { showPopup(e); } else if (!isClosing) { // Move popup to new location Rectangle cellRect = cellComponentProvider.getCellRect(e); if (!cellRect.equals(this.cellRect)) { this.cellRect = cellRect; Point point = new Point(this.cellRect.x + JBUIScale.scale(40), this.cellRect.y - JBUIScale.scale(6) - popupSize.height); SwingUtilities.convertPointToScreen(point, cellComponentProvider.getOwner()); cellPopup.setLocation(point); } } } else { validationInfo = null; hidePopup(false, null); } } }