teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

訂正。

2020/08/13 23:43

投稿

shiketa
shiketa

スコア4133

answer CHANGED
@@ -2,21 +2,41 @@
2
2
 
3
3
  たとえば、ボタン押下時に、重い処理をバックグラウンドで実行させるためにThreadを作成して処理を実行中に、進捗状況を画面上に表示したいときなどに、SwingUtilities#invokeLater()を使います。
4
4
 
5
+
5
6
  ```java
7
+ JButton button = new JButton("...");
8
+ JTextArea progress = new JTextArea();
9
+ button.addActionListener(ev -> {
10
+ while (true) {
11
+ // 重い処理
12
+ SwingUtilities.invokeLater(() -> {
13
+ progress.append("...");
14
+ });
15
+ }
16
+ });
17
+ ```
6
18
 
19
+ うえのように書いてもprogressは更新されません。ほかにもいろいろと問題がでてきます。重い処理をイベントディスパッチスレッド上で実行しているからです。
20
+ progressをきちんと更新してほしければ、つぎのように書きます。
21
+
22
+ ```java
23
+ button.addActionListener(ev -> {
7
- new Thread() {
24
+ new Thread() {
8
- @Override
25
+ @Override
9
- public void run() {
26
+ public void run() {
10
- while (true) {
27
+ while (true) {
11
- // 重い処理
28
+ // 重い処理
12
- SwingUtilities.invokeLater(() -> {
29
+ SwingUtilities.invokeLater(() -> {
13
- textArea.append("...");
30
+ progress.append("...");
14
- });
31
+ });
32
+ }
15
33
  }
16
- }
17
- }.start();
34
+ }.start();
35
+ });
18
36
  ```
19
37
 
38
+ ----
39
+
20
40
  で、件のソースですが、myHome()メソッドが何度も呼び出されているようです。myHome()メソッドが呼び出される都度、LabelやTextAreaを生成して、コンポーネントに追加しています。これがどんどん積み重なって、もたっとしてくるのではないでしょうか。
21
41
 
22
42
  ```java