Mon JProgressBar n'est pas mise à Jour Jusqu'à ce qu'il est de 100%
Ok, j'ai le code suivant.
public class MyProgressBar extends JPanel implements MyData, Serializable {
/**
*
*/
public static final int MAX = 10000;
public static final int WIDTH = 400;
public static final int HEIGHT = 75;
private JProgressBar MyBar = new JProgressBar( SwingConstants.HORIZONTAL, 0, MAX );
private JFrame MyFrame = new JFrame();
private int MyValue = 0;
private Thread MyThread = new Thread( new ProgressThread() );
public MyProgressBar() {
add(MyBar);
int x = ( MyData.SCREEN.width / 2 ) - ( WIDTH / 2);
int y = ( MyData.SCREEN.height / 2 ) - ( HEIGHT / 2);
this.setBounds( x, y, WIDTH, HEIGHT );
MyFrame.setBounds( x, y, WIDTH, HEIGHT );
MyFrame.setUndecorated(true);
MyFrame.getContentPane().setSize( new Dimension( WIDTH, HEIGHT ) );
MyFrame.setMinimumSize( new Dimension( WIDTH, HEIGHT ) );
MyFrame.setPreferredSize( new Dimension( WIDTH, HEIGHT ) );
MyFrame.setSize( new Dimension( WIDTH, HEIGHT ) );
MyFrame.setVisible(false);
MyFrame.getContentPane().setLayout(null);
MyBar.setStringPainted( true );
MyBar.setBorderPainted( true );
MyBar.setValue( 0 );
MyBar.setBounds( 0, 0, WIDTH, HEIGHT );
MyFrame.add( MyBar );
MyFrame.pack();
MyFrame.repaint();
}
public void MyUpdateBar() {
MyBar.setValue( MyValue );
MyBar.repaint();
MyFrame.repaint();
this.repaint();
//dbug.Message( "MYPROGRESSBAR", "MyUpdateBar", "Value is %3.2f %d", MyBar.getPercentComplete(), MyValue );
}
public void MySetValue( int percent ) {
MyValue = (int)( MAX * ( (double)percent / 100.0 ) );
MyUpdateBar();
//dbug.Message( "MYPROGRESSBAR", "MySetValue", "Value is %3.2f %d percent was %d", MyBar.getPercentComplete(), MyValue, percent );
}
public void CreateAndShow () {
MyFrame.setVisible(true);
MyThread.start();
}
public void HideAndClear () {
MyThread.stop();
//frame.setVisible(false);
}
class ProgressThread implements Runnable {
public void run() {
EventQueue.invokeLater(new Runnable() {
public void run() {
while( MyValue < MyBar.getMaximum() ) {
MyBar.setValue( MyValue );
MyBar.repaint();
MyFrame.repaint();
dbug.Message( "MYPROGRESSBAR", "THREAD", "Value is %3.2f %d", MyBar.getPercentComplete(), MyValue );
}
}
});
}
}
}
Comme vous pouvez le voir, j'ai créé une classe que je veux, montrer le progrès. Ce qui se passe c'est que je instancier la classe. Charger mon fichier XML, puis, comme je suis d'analyse de données, je fais appel à la mise à jour de la Mavaleur que je vois quand je laisse mes dbug messages de sortir. Cependant, le bar lui-même n'a même pas montrer jusqu'à ce qu'elle est complète à 100%. J'ai lu sur le filetage et à la suite de quelqu'un d'autre exemple, et si je l'ai laissé comme son exemple, il a travaillé. Si j'ai fait un peu de bricolage (changer une boucle dans le fil pour remplir la setvalue de la barre de progression de lecture d'une valeur), il n'a même pas montrer jusqu'à ce qu'il est 100.
Qu'ai-je fait de mal?
Merci!
OriginalL'auteur Patrick Aquilone | 2012-05-03
Vous devez vous connecter pour publier un commentaire.
Vous thread s'exécute
SwingUtilities.invokeLater
. Vous êtes effectivement en cours d'exécution sur Swing duEvent Dispatch Thread
. Pas sûr de ce que vous essayez d'atteindre. Mais on dirait que vous êtes blocageEDT
et votrewhile
boucle n'est pas mis à jour commeMySetValue
n'est pas exécutée.Envisager d'utiliser
SwingWorker
pour les opérations de longue durée. Comment Utiliser les Barres de Progression illustre l'utilisation deSwingWorker
avecJProgressBar
.Assurez-vous que vous appelez
setValue
méthode de laEvent Dispatch Thread
. Vous pouvez utiliserSwingUtilities.invokeLater
. Lire plus à propos de Fils et Swing.Considérer cette simplifiée de l'échantillon:
est fait appel
EventQueue.invokeLater
. Le problème est que vous êtes bloquent HAE dans votrewhile
boucle.Le problème que j'ai est que je peux obtenir quelque chose comme ça. Mais j'ai besoin d'être en mesure d'appeler une méthode et de définir le pourcentage d'achèvement d'une autre classe (la classe, l'a déclaré ce) et lorsque j'essaie d'ajouter que, dans la, je ne reçois rien.
OriginalL'auteur tenorsax
Le problème est que vous utilisez une boucle dans l'EDT que les mises à jour de la progression. Jusqu'à ce que la boucle s'arrête, l'EDT ne pourra pas vous envoyer des événements (comme repeindre, revalidate, invokeLater, les événements de souris, d'événements clés, etc...) la prévention de l'actualisation de la barre de progression.
Vous devriez essayer de trouver un moyen pour que l'EDT envoyer ses événements entre chaque mise à jour de la barre de progression. Idéalement, vous déplacez votre "travail" en dehors de l'EDT avec un SwingWorker, et en attendant la progressbar mis à jour par le biais de changement de propriété d'auditeurs dans l'EDT.
Pour votre information, en Java, les méthodes et les variables commence par une lettre minuscule. Votre code est vraiment difficile à lire pour les autres.
c'est ce que je pensais, donc j'ai pensé à au moins laissez-vous savez 😉
OriginalL'auteur Guillaume Polet
Donc, j'ai essayé de suivre le tutoriel et voici où j'en suis.
Ok, j'ai essayé de suivre des tutoriels mais je continue de se perdre quelque part. Ce dont j'ai besoin est une classe qui crée et affiche une barre de progression (JProgressBar) que je ne peux définir la valeur que je itérer sur les données chargées à partir d'un fichier et de le placer dans la base de données de la mémoire. Mes problèmes viennent que tous les exemples que j'ai trouvé a une sorte de compteur qui remplit la barre de progression et s'exécute à partir d'un "principal" de la fonction. Chaque fois que j'ai modifier ce tutoriel être une classe que je peux appeler et afficher la barre, je n'ai pas la barre (c'est à dire la monture est en place mais le bar n'a même pas l'air comme il est ajouté à l'image, jusqu'à ce que après l'itération est fait). J'ai essayé d'utiliser SwingUtilities.invokeLater et SwingWorker (dernière tentative, de la catégorie ci-dessous) ayant tous le même problème. Pour aggraver les choses, je peux faire une dbug.monannonce (essentiellement les envoie au Système.out) et de voir un message qui montre que la barre est en train de changer dans la mémoire juste pas à l'affiche. Je suis évidemment quelque chose lui manque sans doute simple, mais je ne peux pas penser à ce qu'il est.
Oh, une autre chose, si je laisse le tutoriel comme il est (http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/components/ProgressBarDemo2Project/src/components/ProgressBarDemo2.java) et il suffit de changer le principal, à un createAndShow méthode, ça fonctionne, mais bien sûr il ne fait pas ce que je dois faire.
Je ne poste une autre question à ce sujet, mais ont modifié la classe tellement que j'ai cru bon de poster une nouvelle question.
Donc, ici, est modifié mon code ne semble pas fonctionner:
OriginalL'auteur Patrick Aquilone
Ci-dessous extrait des mises à jour de la barre de progression en cours de déroulement
OriginalL'auteur Kirk Patrick Brown