2011-03-30 3 views
2

Je dois implémenter une carte dans Java Swing, qui est connectée à une base de données spatiale pour gérer certaines requêtes. J'ai utilisé un jLabel pour représenter l'image de la carte.composant interactif dans Java Swing

J'ai besoin de faire glisser une zone et de renvoyer tous les éléments possibles dans cette zone. Chaque élément de retour doit apparaître sur la carte sous la forme d'un triangle jaune ou d'un cercle rouge et ces polygones peuvent être cliqués pour fournir des informations supplémentaires ailleurs.

Voici ma confusion. Quel composant dois-je utiliser pour démontrer l'élément sur l'image? Il besoin d'être interactive si intuitivement, je choisis JButton, voici ma mise en œuvre:

Iterator<JGeometry> it = al.iterator(); 
    while (it.hasNext()) { 
     JButton jButton1 = new JButton(); 
     jButton1.setText("213"); 
     jButton1.setBounds(325 + (int)it.next().getPoint()[0], 70 + (int)it.next().getPoint()[1], 30,30); 
     jButton1.setVisible(true); 
     getContentPane().add(jButton1); 
    } 

Mais il ne montre aucun bouton sur le panneau. Je suppose que les deux jButton et jLabel contenant l'image sont au même niveau, donc il peut y avoir un certain chevauchement. Comment puis-je faire face à cela? Y a-t-il une meilleure solution pour ce cas?

expected performance

+1

utilisez-vous un gestionnaire de mise en page null? – MeBigFatGuy

Répondre

1

envisager d'avoir ces éléments tirés sur une JPanel, qui écoute les événements de souris. L'utilisateur clique et fait glisser, créant une boîte délimitée que vous pouvez déterminer si l'un de vos objets se croisent et obtenir leurs coordonnées. Voici une demo qui peut vous aider à démarrer.

1

GraphPanel montre une approche pour faire plusieurs sélections en cliquant et en faisant glisser.

1

Ceci n'est pas directement lié à votre question, mais il y a un autre problème dans votre code qui vous posera problème.

Vous appelez it.next() deux fois dans la boucle. Chaque appel à next() va déplacer l'itérateur d'un élément, donc le premier objet que vous obtenez ne sera pas le même que le second. Ainsi, non seulement vos résultats seront erronés, mais vous obtiendrez une exception si le nombre d'éléments dans al est impair (parce que vous prenez deux éléments à la fois). Au lieu de cela, vous ne devez appeler next() une fois et affecter la valeur à une variable locale ou utiliser Java 6 pour boucle syntaxe:

for(JGeometry geom : al) { 
    ... 
    jButton1.setBounds(325 + (int)geom.getPoint()[0], 70 + (int)geom.getPoint()[1], 30, 30); 
    ... 
} 
+0

merci boffinbraiN, c'est vraiment utile – ssb

Questions connexes