2009-05-26 8 views
0

Je travaille sur une interface graphique où les composants JComponents sont "estampillés" sur l'écran. En d'autres termes, les composants réels ne sont pas affichés, mais les images des composants. Il s'agit d'un graphique dans lequel les nœuds du graphique sont des composants Swing personnalisés, ou plutôt des images estampées des composants Swing.Can findComponentAt() peut-il fonctionner avant qu'un composant JComponent ne soit peint?

Maintenant, je veux afficher des info-bulles pour des composants spécifiques dans mes nœuds. Pour ce faire, je crée un composant JComponent identique à celui affiché et en utilisant les valeurs x et y de la souris, je demande à findComponentAt() pour le composant approprié. Cela ne fonctionne pas très bien. Si je réutilise JComponents pour les noeuds, il devient confus si j'essaie d'obtenir une info-bulle pour un noeud de taille différente de la dernière peinte. Si je crée un nouveau composant JComponent pour chaque nœud et un nouveau lors du calcul de l'info-bulle, la taille initiale du nouveau est 0,0. Je peux définir la taille en utilisant le calcul getPreferredSize(), mais cela ne fonctionne toujours pas. La racine JComponent (un JPanel) a la bonne taille, mais aucun de ses enfants n'a encore de taille.

Un échantillon du code de calcul de infobulle:

// 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 revient comme la racine JComponent peu importe valeurs x et y il est passé.

Est-il possible de faire en sorte que Swing calcule correctement la taille et l'emplacement des composants JComponents sans les peindre?

Répondre

0

J'ai trouvé moi-même la réponse. Le problème principal est que Swing ne veut pas mettre en page un composant à moins que ce composant n'ait un parent approprié. Donc, j'ai changé mon code à ceci:

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); 

Et cela fonctionne comme un charme. Vous devriez être capable d'utiliser un processus similaire pour trouver des composants enfants dans JLists ou JTables (qui utilisent également ce modèle Renderer).

0

Vous avez des images de vos composants dans le graphique, ils doivent avoir leurs tailles pour pouvoir peindre correctement.

Pour trouver votre "tampon", vous devez revenir en arrière (dans l'ordre z) dans votre graphique et trouver la première image dans laquelle se trouve la position de votre souris.

Les tailles préférées ne fonctionneront pas, vous devriez compter sur la taille des «timbres» je pense.

+0

Le problème n'est pas de trouver le bon noeud. Je l'ai. Le problème consiste à obtenir le composant enfant dans le nœud. Je veux des info-bulles différentes dans le même nœud, selon que la souris est sur une étiquette ou une image. –

Questions connexes