2012-02-03 6 views
4

J'ai un problème étrange ... Je suis un programmeur Java "enthousiaste" relativement nouveau (j'avais l'habitude de gagner ma vie en hacker Perl, dans une carrière précédente), travaillant sur mon premier semestre. application réelle. "Main-Class" est la classe MyApp, qui crée une instance UserInputDialog.Java: la deuxième fenêtre est vide

UserInputDialog est une classe que j'ai écrit que extend s JFrame, met en œuvre et ActionListenerKeyListener, utilise FlowLayout, et présente à l'utilisateur une JLabel, JTextField et Annuler/OK JButton s. Lorsque le JTextField génère un KeyEventkeyReleased() == KeyEvent.VK_ENTER, ou lorsque le "OK" JButton génère un ActionEvent, UserInputDialog effectue une validation d'entrée, appelle setVisible(false), puis appelle MyApp.doSomething(JTextFieldInstance.getText()).

Tout cela fonctionne parfaitement. Mais maintenant j'essaie d'ajouter une fenêtre de progression à MyApp, car doSomething() peut parfois prendre un certain temps à compléter.

J'ai créé la classe ProgressWindow, qui étend JFrame, utilise BorderLayout et jette un JProgressBar dans. NORTH et un JScrollPane (enveloppant un JTextArea) dans. . ProgressWindow fonctionne parfaitement lorsqu'il est instancié à partir de ProgressWindowTester et alimenté des données de test. Il fonctionne aussi bien si je copier-coller le test pour les boucles de ProgressWindowTester en MyApp et ne pas MyApp instancier UserInputDialog (il n'y a rien inhérent à MyApp qui est à l'origine de ce comportement, il semble être une sorte d'interaction Je ne comprends pas, entre UserInputDialog et ProgressWindow).

Mais quand je tente d'utiliser ProgressWindow dans MyApp comme prévu, à savoir, ProgressWindow setVisible (vrai), je reçois une fenêtre Swing blanc (de la bonne taille, et la barre de titre correctement défini). Les composants JProgressBar et JScrollPane/JTextArea n'apparaissent pas. Les méthodes ProgressWindow sont appelées par MyApp correctement (System.err.println() messages montrent une interaction correcte), tout semble bien fonctionner, juste, les composants qui devraient être visibles dans ProgressWindow ... ne le sont pas.

Je peux poster des extraits de code, mais il est un peu alambiquée, et je suis probablement manquer quelque chose d'évident ...

Je suis familier avec le concept de la séparation logique de l'interface utilisateur et les affaires en général (par exemple, je utilisé HTML::Template et Class::DBI et CGI::Application lors de la construction des applications Perl), mais je ne suis pas sûr que je suis « faire droit » en Java ...

Merci à l'avance! Oh, j'ai exactement le même comportement sur les deux environnements dans lesquels j'ai essayé le code: javac 1.6.0_29 sur Mac OS X 10.6.8 ("Snow Leopard"); et javac 1.7.0_02 [1] sur la distribution Fedora 15 Linux, noyau 2.6.31.10-3, environnement de bureau LXDE.

[1] Téléchargé directement depuis oracle.com; Je n'utilise pas OpenJDK (je sais que JDK 7 est basé sur OpenJDK) ou gcj ou quoi que ce soit

+2

Difficile à dire sans code, mais pourrait être un problème de thread Swing, surtout si la tâche de longue durée est effectuée sur le thread Swing: http://java.sun.com/products/jfc/tsc/articles /threads/threads1.html – DNA

Répondre

5

Vous avez une concurrence dans le problème Swing où vous essayez de faire un long processus sur l'événement Swing fil ou EDT.Étant donné que ce thread est chargé de dessiner tous les composants et de traiter les entrées utilisateur, s'il est lié par votre processus de longue durée, votre interface graphique sera effectivement gelée jusqu'à ce que le processus soit terminé. La clé consiste à utiliser un thread d'arrière-plan tel que celui fourni par un SwingWorker pour les processus de longue durée, afin que le thread d'événement ne soit pas verrouillé. Consultez Concurrency in Swing pour plus d'informations à ce sujet. Consultez également le JProgressBar Tutorial pour d'autres informations sur l'utilisation des barres de progression avec des threads d'arrière-plan.

De même, vous ne voudrez pas utiliser un JFrame où un dialogue, tel qu'un JDialog, est beaucoup plus approprié. Aussi, vous voudrez éviter l'utilisation de KeyListeners avec Swing. Il vaudrait mieux simplement ajouter un ActionListener à votre JTextField puisque son comportement par défaut est de répondre aux pressions de la touche.

Oh, et bienvenue sur StackOverflow.com!

+2

+1 Je suis d'accord! Il y a un exemple connexe [ici] (http://stackoverflow.com/a/4637725/230513). – trashgod

+0

Oui, et il y a un autre exemple connexe [ici] (http://stackoverflow.com/questions/8251607/running-a-jframe-with-a-jprogressbar/8251620#8251620). –

Questions connexes