2010-05-26 7 views
7

J'essaie d'animer une pièce d'échecs dans un tableau. D'abord j'ai créé un objet java.util.Timer que "scheduleAtFixedRate" un TimerTask implémenté comme une fonction proxy. Donc j'ai gardé un enregistrement de la pièce à déplacer (enregistrement de pièce) et quand c'est approprié (quand l'utilisateur déplace la pièce en utilisant la souris), la fonction de proxy TimerTask devrait être testée si l'enregistrement n'est pas nul et exécuter la pièce fonction de déplacement. La fonction de déplacement des pièces met juste à jour les coordonnées x et y de la pièce, en fonction d'un vecteur pré-calculé. Je mets un add-watch sur le morceau-moving-record donc quand il change il devrait repeindre le tableau (canvas). La méthode de peinture teste si ce disque n'est pas nul pour le peindre.Comment faire de l'animation en utilisant swing et clojure?

Le problème est que l'animation n'apparaît pas. La pièce saute juste au destin, sans le mouvement entre. Il y a un problème avec le schéma d'animation ou y a-t-il une meilleure façon de le faire?

Répondre

2

mises à jour Swing, les composants doivent être effectuées sur le fil Dispatch Event (HAE). Vous devez donc utiliser un minuteur de swing car tout code exécuté lorsque le minuteur se déclenche sera exécuté sur l'EDT.

Tout ce que vous devez faire est de définir l'emplacement de la pièce d'échecs et elle se repeindra automatiquement.

Lisez la section du tutoriel Swing sur How to Use Timers pour plus d'informations.

+0

Vous avez raison, le mouvement fonctionne maintenant mais n'est pas encore assez lisse, permettrait de vérifier les minuteries de swing plus. Merci pour votre réponse. –

+0

Vous ** N'AVEZ PAS ** à utiliser ** Swing Timer ** pour animer vos composants. Vous pouvez configurer une minuterie avec * n'importe quel * utilitaire que vous voulez, puis passer l'exécution à EDT avec ** SwingUtilities.invokeLater ** (ou ** invokeAndWait **). – SkyDan

1

Swing ne fait pas d'animation automatiquement, cela n'a pas d'importance si vous avez une minuterie ou non. Si vous voulez animer un mouvement, vous devez déplacer la pièce à une certaine distance et repeindre la toile à chaque mouvement afin qu'elle donne l'illusion d'un mouvement.

+0

C'est exactement ce que je fais, quand la pièce bouge, la méthode repaint de canvas est appelée par add-watch. –

0

Il y a une démo Animator dans le JDK. Il utilise awt mais il devrait vous donner quelques idées.

jdk1.6.0_20 \ demo \ applets \ Animator

1

vous pouvez utiliser la bibliothèque Trident: Here

+0

Devrait essayer, clojure avec swing semble difficile pour moi. –

0

Une autre idée pourrait être de regarder le cadre de visualisation de traitement de processing.org. C'est un langage de programmation simple mais puissant et bien documenté pour l'animation et la visualisation. L'API est très simple et possède un wrapper Clojure très transparent nommé Rosado.

Questions connexes