2010-10-11 7 views
2

Je n'ai pas trouvé de réponse à cette question. Je me demande si c'est possible. Voici mon problème.Est-il possible d'appeler la boucle d'événement principale java?

J'ai une application de traitement de base écrite en Fortran. L'application a besoin d'une nouvelle interface utilisateur. Le code Fortran a sa propre boucle principale. Il communique avec l'interface utilisateur via une routine d'interface. Cette routine appelle la boucle d'événement principal de quelle que soit la bibliothèque d'interface utilisateur utilisée, par exemple l'interface utilisateur actuelle est Motif. Donc, il appelle la boucle d'événement principal Motif. Je voudrais remplacer Motif par Java swing. Je ne pouvais pas trouver de chose sur la boucle d'événement principal de Java. Mes questions sont
1) Est-il possible d'appeler la boucle principale de Java directement?
2) Je sais qu'il est possible que Java appelle une autre langue. Comment une autre langue peut-elle appeler une routine Java?

-------------- Autres commentaires

On dirait qu'il pourrait ne pas être possible de le faire, du moins pas la façon dont je conçois. Voici un algorithme que j'essaie d'utiliser

faire boucle jusqu'à fin
faire un peu de traitement interne
1 check file d'attente d'événements ui si la file d'attente a événement
2 répartiteur d'événements ui d'appel pour tous les événements de l'interface utilisateur
de boucle d'extrémité

ce que j'aime savoir, y at-il une sorte de routine pour remplacer # 1 et # 2. J'espérais que Java a quelque chose comme EventQueue.hasEvent();
EventQueue.dispatchEvent (événement); Des commentaires à ce jour, il ne semble pas y avoir une telle chose.

+0

Il semble que ce ne soit pas possible. Au moins pas la façon dont je l'imagine.Voici l'algorithme de la boucle principale I qui essaie d'utiliser – tadpole

+0

@tadpole: pourquoi voulez-vous voir s'il y a des événements dans la file d'attente? Cette partie n'est en effet pas vraiment possible en Java, mais je ne comprends pas pourquoi vous pensez en avoir besoin. –

+0

S'il n'y a aucun événement dans la file d'attente, il n'est pas nécessaire d'envoyer l'événement. Qu'y a-t-il à expédier? C'est une approche normale pour toute boucle d'événement principal de l'interface utilisateur. – tadpole

Répondre

3
  1. SwingUtilities.invokeAndWait() et invokeLater()
  2. JNI can be used intégrer une machine virtuelle Java dans une application native et communique avec lui via une bibliothèque liée. Mais dans votre scénario, il serait probablement préférable de faire fonctionner l'interface utilisateur en tant que processus séparé et de communiquer avec l'application principale via des sockets.
1

Non, vous ne pouvez pas appeler directement la boucle d'événement principal GUI; Cependant, vous pouvez soumettre des éléments à la boucle d'événement principal pour éventuellement être exécuté sur son thread. La boucle d'événement principal fait beaucoup de choses à l'intérieur de l'interface graphique, certaines choses planifient les graphiques à dessiner, acceptant l'entrée, etc. C'est un choix de conception, et Java est allé avec un modèle multi-threading où le le code non-GUI ne s'exécute pas dans la boucle d'événements GUI. Le raisonnement derrière cela est probablement dû à la mise en pause ou à la corruption de la boucle de l'interface graphique, ce qui provoque des problèmes de performances de l'interface graphique.

0

Vous pouvez refaçonner votre application à exécuter comme une application Java, et d'appeler vos trucs Fortran via JNI. Ensuite, dans votre application Java, vous pouvez obtenir le système event queue par Toolkit.getDefaultToolkit().getSystemEventQueue(), et appeler ses peekEvent et postEvent.

+0

Merci. Jusqu'à présent, cela semble être le plus pertinent pour ce que j'essaie de faire. Bien que je ne sois pas sûr des détails, mais c'est un début. De la traite limitée avec JNI, j'ai vu Java appelle d'autres langues, mais pas l'inverse. – tadpole

+0

Oui, JNI va par définition (à partir du lien de @ oyo): "... afin que la JVM puisse localiser et invoquer des méthodes natives". L'autre façon serait "FNI" ou quelque chose comme ça :) –