Может ли findComponentAt () работать до того, как JComponent будет нарисован? - PullRequest
0 голосов
/ 27 мая 2009

Я работаю над графическим интерфейсом, где 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, не рисуя их на самом деле?

Ответы [ 2 ]

0 голосов
/ 03 июня 2009

Я нашел ответ сам. Основная проблема заключается в том, что Swing не хочет размещать компонент, если у этого компонента нет подходящего родителя. Итак, я изменил свой код на это:

    parentComponent.add(nodeComponent);

    // Set the node's size and validate it so it's laid out properly
    nodeComponent.setBounds((int)realizer.getX(), (int)realizer.getY(), (int)realizer.getWidth(), (int)realizer.getHeight());

    nodeComponent.validate();

    // Now we can properly find the child component under our mouse
    Component componentTop = nodeComponent.findComponentAt(relativeX, relativeY);

    // Now remove it from the view
    parentComponent.remove(nodeComponent);

И это работает как шарм. Вы должны иметь возможность использовать аналогичный процесс для поиска дочерних компонентов в JLists или JTables (которые также используют этот шаблон Renderer).

0 голосов
/ 27 мая 2009

У вас есть изображения ваших компонентов на графике, они должны иметь свои размеры, чтобы можно было правильно рисовать.

Чтобы найти свой «штамп», вы должны идти назад (в z-порядке) на графике и найти первое изображение, в которое попадает ваша позиция мыши.

Предпочтительные размеры не будут работать, вы должны полагаться на размер "штампов", я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...