質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

979閲覧

Java swingのTimer

Chandler_Bing

総合スコア673

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/01/14 11:10

以下のコードについて質問があります。

質問❶
APIリファレンスを調べたところ、TimerのコンストラクタはTimer​(int delay, ActionListener listener)となっております。
Timer timer = new Timer(500, this)のthisはActionListenerを指しているのでしょうか。

質問❷
このthisも同じくActionListenerを指しているのでしょうか。

質問❸
actionPerformedは500ミリ間隔で呼ばれるように設定されていますが、これはあくまでtimerが動いている間で、ストップしている間は動かないですよね。

Java

1package week10; 2 3import java.awt.event.ActionEvent; 4import java.awt.event.ActionListener; 5 6import javax.swing.JButton; 7import javax.swing.JFrame; 8import javax.swing.JLabel; 9import javax.swing.Timer; 10 11public class TimerTest extends JFrame implements ActionListener { 12 13 private static final long serialVersionUID = 1L; 14 15 Timer timer = new Timer(500, this);//質問❶ 16 JLabel label = new JLabel("0", JLabel.CENTER); 17 JButton bt = new JButton("タイマー"); 18 int iCount = 0; 19 20 TimerTest() { 21 setBounds(200, 200, 200, 150); 22 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 23 timer.setActionCommand("timer"); 24 add("North", label); 25 bt.addActionListener(this);//質問❷ 26 add("Center", bt); 27 setVisible(true); 28 } 29 30 public static void main(String[] args) { 31 new TimerTest(); 32 } 33//質問❸ 34 public void actionPerformed(ActionEvent e) { 35 String cmd = e.getActionCommand(); 36 if (cmd.equals("timer")) { 37 if (++iCount > 9) 38 iCount = 0; 39 label.setText(String.valueOf(iCount)); 40 } 41 if (e.getSource() == bt && !timer.isRunning()) 42 timer.start(); 43 else if (e.getSource() == bt && timer.isRunning()) 44 timer.stop(); 45 } 46}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問❶

Timer timer = new Timer(500, this)のthisはActionListenerを指しているのでしょうか。

ActionListenerの一つのインスタンスとして、自分自身を渡しています。

質問❷

このthisも同じくActionListenerを指しているのでしょうか。

質問1と同じオブジェクトです。

質問❸

actionPerformedは500ミリ間隔で呼ばれるように設定されていますが、これはあくまでtimerが動いている間で、ストップしている間は動かないですよね。

ドキュメントを見る限り、そのように読めますね。

実験

Java

1class Main { 2 { 3 System.out.println(this + " <- フィールドの初期化時"); 4 } 5 6 Main() { 7 System.out.println(this + " <- コンストラクタ内"); 8 } 9 10 public static void main(String[] args) { 11 for(int i = 0; i < 3; ++i) { 12 System.out.println( 13 String.format("--------%d回目--------", i+1) 14 ); 15 16 Main m = new Main(); 17 System.out.println(m + " <- 呼び出し元"); 18 } 19 } 20}

実行結果 Wandbox

--------1回目-------- Main@3930015a <- フィールドの初期化時 Main@3930015a <- コンストラクタ内 Main@3930015a <- 呼び出し元 --------2回目-------- Main@629f0666 <- フィールドの初期化時 Main@629f0666 <- コンストラクタ内 Main@629f0666 <- 呼び出し元 --------3回目-------- Main@1bc6a36e <- フィールドの初期化時 Main@1bc6a36e <- コンストラクタ内 Main@1bc6a36e <- 呼び出し元

二つのthisが同じMainインスタンスを指していることが分かります。

投稿2019/01/14 11:17

編集2019/01/14 11:34
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chandler_Bing

2019/01/14 11:27

丁寧な回答ありがとうございます。自分自身ということはTimerでしょうか。Timerはobjectを継承しているだけなのに、ActionListener型として渡しても良いのでしょうか。
LouiS0616

2019/01/14 11:29

TimerTestクラス内において、thisはTimerTestインスタンスです。
Chandler_Bing

2019/01/14 11:43

ありがとうございます。 public static void main(String[] args) { new TimerTest(); } をした時点で、 Timer timer = new Timer(500, this)のthisにはその情報が入ったということだったんですね。 さらに、このTimerTestはactionListerを引き継いでいるから問題がない。 この理解でよろしいでしょうか。
LouiS0616

2019/01/14 11:45

概ね正しいように思います。
Chandler_Bing

2019/01/14 12:50

ありがとうございました。まだまだJava初心者ですが精進します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問