seul événement cliqué sur la souris de mise à jour JLabel propriété texte JLabel correctement
Question
J'utilise un thread java pour mettre à jour la valeur de texte JLabel dans ma demande mais après le texte mis à jour le JLabel JLabel montrant toutes les valeurs passées et mises à jour périodiquement nouvelle valeur pour lui-même via rafraîchissante
mais quand j'utiliser la fonction de mise à jour même dans le cas de mouseclick JLabel il se met à jour comme prévu et montrant la dernière valeur que
ce qui peut provoquer ce problème suis-je manque quelques méthodes événement mouseclick appelle en interne?
Nore: application est JApplet
La solution
Vous devez vous assurer que les modifications Swing composants de l'interface sont exécutées sur le thread de répartition des événements. Voici deux suggestions pour y parvenir:
Minuteur
Vous pouvez consulter javax.swing .Timer si l'objectif est d'actualiser périodiquement le texte JLabel
. Les feux de minuterie ActionEvent
s périodiquement sur le thread de répartition de l'événement:
int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
label.setText("foo");
}
};
new Timer(delay, taskPerformer).start();
SwingWorker
Sinon, vous voudrez peut-être envisager d'utiliser un SwingWorker pour effectuer votre traitement de fond. Le thread de travail de fond peut communiquer ces informations au fil de répartition de l'événement en appelant publish
.
new SwingWorker<Void, String>() {
// Called by the background thread.
public Void doInBackground() {
for (int i=0; i<100; ++i) {
// Do work. Periodically publish String data.
publish("Job Number: " + i);
}
}
// Called on the Event Dispatch Thread.
@Override
protected void process(List<String> chunks) {
// Update label text. May only want to set label to last
// value in chunks (as process can potentially be called
// with multiple String values at once).
for (String text : chunks) {
label.setText(text);
}
}
}.execute();
Autres conseils
Je ne sais pas exactement ce qui se passe mais je commencerais par vous assurer que votre mise à jour se produit dans le thread de répartition des événements. Demandez à votre appel fil de mise à jour:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// ...update the text...
}
});
Voir la Event Dispatch Discussion tutoriel .
pourquoi ne pas u essayez ceci: nomÉtiquette .paintImmediately ( nomÉtiquette .getVisibleRect ());