Я работаю над графическим интерфейсом, где JComponents "отпечатаны" на экране. Другими словами, фактические компоненты не отображаются, но изображения компонентов. Это график, где узлами графа являются пользовательские компоненты Swing, или, скорее, штампованные изображения компонентов Swing.
Теперь я хочу отобразить всплывающие подсказки для определенных компонентов в моих узлах.
Для этого я создаю JComponent, который идентичен отображаемому, и, используя значения x и y мыши, я спрашиваю findComponentAt () для соответствующего компонента. Это не очень хорошо работает. Если я повторно использую JComponents для узлов, это сбивает с толку, если я пытаюсь получить всплывающую подсказку для узла, размер которого отличается от последнего нарисованного. Если я создаю новый JComponent для каждого узла и новый при расчете всплывающей подсказки, начальный размер нового 0,0. Я могу установить размер с помощью вычисления getPreferredSize (), но это все равно не работает. Корневой JComponent (JPanel) имеет правильный размер, но ни один из его дочерних элементов еще не имеет размера.
Пример кода расчета всплывающей подсказки:
// Get a component that matches the stamped component
JComponent nodeComponent = getNodeComponent();
// These next two lines get the size right
nodeComponent.setSize(nodeComponent.getPreferredSize());
nodeComponent.revalidate();
Component componentTop = nodeComponent.findComponentAt(relativeX, relativeY);
componentTop возвращается как корневой JComponent, независимо от того, какие значения x и y ему переданы.
Так можно ли заставить Swing правильно рассчитать размер и расположение JComponents, не рисуя их на самом деле?