私はJavaスレッドを使用してアプリケーションのjlabelテキスト値を更新していますが、jlabel jlabelのテキストを更新した後、過去に更新されたすべての値と新しい値を定期的に更新して順番に表示します
しかし、jlabelのmouseclickイベント内で同じ更新機能を使用すると、期待どおりに更新され、最後の値のみが表示されます
この問題の原因は何ですか? mouseclick イベントが内部的に呼び出すメソッドがいくつかありませんか?
nore:アプリはジャプレット
何が起こっているのか正確にはわかりませんが、イベントディスパッチスレッドで更新が行われることを確認することから始めます. アップデータ スレッドを呼び出します。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// ...update the text...
}
});
イベントディスパッチスレッドのチュートリアルを参照してください。
Swing UI コンポーネントへの変更はすべて、イベント ディスパッチ スレッドで実行する必要があります。これを実現するための 2 つの提案を次に示します。
タイマー
テキストを定期的に更新することが目的の場合は、javax.swing.Timerを確認してください。JLabel
タイマーActionEvent
は、イベント ディスパッチ スレッドで定期的に s を起動します。
int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
label.setText("foo");
}
};
new Timer(delay, taskPerformer).start();
スイングワーカー
または、 SwingWorkerを使用してバックグラウンド処理を実行することを検討することもできます。バックグラウンド ワーカー スレッドは、 を呼び出すことによって、イベント ディスパッチ スレッドに情報を返すことができます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();
これを試してみませんか: labelname .paintImmediately( labelname .getVisibleRect());