Base De Durée Indéterminée JProgress Bar De L'Utilisation
Je veux simplement avoir une durée indéterminée JProgressBar animer dans le coin en bas à gauche de mon image quand un long téléchargement est terminé.
J'ai regardé à travers de nombreux tutoriels, aucun n'est clair pour moi. Je veux simplement avoir animer alors que le fichier est téléchargé en arrière-plan. Chaque façon j'ai essayé cela, il n'a pas d'animer la barre de progression jusqu' après le téléchargement est terminé.
J'ai besoin d'aide pour savoir où placer mon appel de download ().
class MyFunClass extends JFrame {
JProgressBar progressBar = new JProgressBar();
public void buttonClicked() {
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
progressBar.setIndeterminate(true);
progressBar.setVisible(true);
//Do I do my download() in here??
}});
//Do download() here???
progressBar.setVisible(false);
}
}
Merci d'avance!
Solution
Edit: Pour ceux qui ont un problème similaire pour moi dans l'avenir, c'est la solution de base pour un problème de base. Ce n'est pas mon code, mot à mot, mais un croquis. À l'intérieur de buttonClicked()
:
public void buttonClicked() {
class MyWorker extends SwingWorker(String, Object) {
protected String doInBackground() {
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
//Do my downloading code
return "Done."
}
protected void done() {
progressBar.setVisible(false)
}
}
new MyWorker().execute();
}
- Vous devriez jeter un oeil à docs.oracle.com/javase/tutorial/uiswing/components/..., même s'il semble compliqué. Ce que vous devez faire est de lancer le téléchargement dans un autre thread (backgroundworker). Puis la main (gui) filetage de la barre de l'animation. La façon dont vous le faites est en fait l'inverse.
- Merci de voir Edit 2 pour ma réponse à crrect certains problèmes.
Vous devez vous connecter pour publier un commentaire.
Votre code actuel ne montre pas de création d'un thread d'arrière-plan, mais plutôt qu'il vous montre en essayant de file d'attente un code sur le Swing fil de l'intérieur le Swing thread qui n'a aucun sens pour ce problème (bien qu'il y a parfois des moments où vous voudrez peut-être faire cela, mais encore une fois, pas ici). La seule façon de réussir, c'est d'utiliser un thread d'arrière-plan. Le standard d'Oracle JProgressBar tutoriel et La simultanéité dans le Swing passe au travers de tout cela.
La base, c'est que vous devez mettre à jour la JProgressBar de la Balançoire Fil sera de faire votre long processus en cours d'exécution dans le thread d'arrière-plan, comme celui fourni par un SwingWorker objet. Il y a trop de détails pour nous de passer en revue tous ici, et donc, tout ce que je peux faire est de mettre un lien, mais nous serons heureux de vous aider à comprendre les détails une fois que vous passez en revue les tutoriels. Il suffit de consulter les tutoriels et venez sur le dos avec vos questions spécifiques si vous êtes toujours bloqué.
Edit 1
Vous affirmez:
Oui, vous pouvez créer un SwingWorker objet à l'intérieur de la
buttonClicked()
méthode et de l'exécuter il.Désolé, mais je n'ai aucune idée de ce que vous êtes en train de dire ou quelles questions vous pensez que le filetage sera la cause. Le
buttonClicked()
méthode susceptible doit exécuter sur l'EDT et pas dans un thread d'arrière-plan.Également noter que dans la plupart de mes plus complexe Swing GUI, je fais souvent mon fichier de téléchargement dans un autre (modèle) objet et de créer mon SwingWorker dans un autre objet encore (de contrôle) de l'objet graphique (la vue). Il peut sembler plus compliqué de faire de cette façon, mais c'est un beaucoup plus facile à déboguer, de maintenir et d'améliorer mon programme quand je le fais de cette façon, surtout quand j'ai fortement l'utilisation des interfaces pour me permettre de tester tous les composants du programme dans l'isolement.
Edit 2
Quelques corrections à votre solution de poste. Vous posté le:
qui a des problèmes
doInBackground()
, pasrunInBackground()
Donc changer: