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

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

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

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

Q&A

解決済

1回答

618閲覧

Java内部クラスの実行タイミング

Chandler_Bing

総合スコア673

Java

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

0グッド

0クリップ

投稿2019/01/06 12:59

以下のコードを使用しモグラ叩きゲームを作っているのですが二つ目のコードにTimerActionTimerTaskというクラスがあり、そこでrun()メソッドを読んでいますが、この実行のタイミングはいつなのでしょうか。コードを見る限りどこからも呼び出していない気がします。
ただ挙動から考えると、マウスのイベントがある都度(MGPanelで処理が発生)に下までコードを順に実行し、その際にTimerActionTimerTaskを実行するので毎回(マウスイベント時)、run()が実行されるという考えで問題ないでしょうか。

Java

1package mousegame; 2 3import java.awt.BorderLayout; 4 5import javax.swing.JFrame; 6 7/** 8 * フレームクラス 9 */ 10public class MGFrame extends JFrame { 11 12 private MGPanel panel = null; 13 14 /** 15 * ここからはじまります 16 */ 17 public static void main(String[] args) { 18 MGFrame mg01 = new MGFrame(); 19 } 20 21 /** 22 * コンストラクタ 23 */ 24 public MGFrame() { 25 26 // スーパークラスを呼び出す 27 super(); 28 29 // Xボタンが押されたら終了する 30 super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 31 // レイアウト設定 32 super.setLayout(new BorderLayout()); 33 34 // パネルを生成する 35 panel = new MGPanel(); 36 37 // フレームのコンテントペイントを置き換える 38 super.setContentPane(panel); 39 40 // フレームを表示 41 super.setVisible(true); 42 // サイズを最適化する 43 super.pack(); 44 45 } // end MGFrame 46 47} 48

Java

1package mousegame; 2 3import java.awt.Color; 4import java.awt.Dimension; 5import java.awt.Graphics; 6import java.awt.event.MouseAdapter; 7import java.awt.event.MouseEvent; 8import java.awt.image.BufferedImage; 9import java.io.InputStream; 10import java.util.TimerTask; 11 12import javax.imageio.ImageIO; 13import javax.swing.JOptionPane; 14import javax.swing.JPanel; 15 16/** 17 *パネルクラス 18 */ 19public class MGPanel extends JPanel { 20 21 /** マウスアダプタ */ 22 private MGMouseAdapter mgma = null; 23 24 /** ピコピコハンマー座標 */ 25 private int px = 0; 26 /** ピコピコハンマー座標 */ 27 private int py = 0; 28 29 /** もぐら座標 */ 30 private int mx = 350; 31 /** もぐら座標 */ 32 private int my = 200; 33 34 /** ピコピコハンマー */ 35 private BufferedImage[] imagePHs = null; 36 /** ピコピコハンマー状態 */ 37 private int ph = 0; 38 39 /** もぐら */ 40 private BufferedImage[] imageMs = null; 41 /** もぐら状態 */ 42 private int m = 0; 43 44 /** もぐらの時間 */ 45 private int timeM = 0; 46 /** タイマー*/ 47 private java.util.Timer timerThis = null; 48 49 /** 50 * コンストラクタ 51 */ 52 public MGPanel() { 53 54 // スーパークラスを呼び出す 55 super(); 56 57 try { 58 59 // パネルサイズ 60 super.setPreferredSize(new Dimension(800, 600)); 61 // レイアウト設定 62 super.setLayout(null); 63 64 // マウスアダプタを生成 65 mgma = new MGMouseAdapter(); 66 // パネルにマウスリスナーを追加する 67 super.addMouseListener(mgma); 68 super.addMouseMotionListener(mgma); 69 70 // ピコピコハンマーを読み込む 71 imagePHs = new BufferedImage[2]; 72 InputStream isPH00 = this.getClass().getResourceAsStream("PH00.gif"); 73 imagePHs[0] = ImageIO.read(isPH00); 74 isPH00.close(); 75 76 InputStream isPH01 = this.getClass().getResourceAsStream("PH01.gif"); 77 imagePHs[1] = ImageIO.read(isPH01); 78 isPH01.close(); 79 80 // もぐらを読み込む 81 imageMs = new BufferedImage[2]; 82 InputStream isM00 = this.getClass().getResourceAsStream("M00.gif"); 83 imageMs[0] = ImageIO.read(isM00); 84 isM00.close(); 85 86 InputStream isM01 = this.getClass().getResourceAsStream("M01.gif"); 87 imageMs[1] = ImageIO.read(isM01); 88 isM01.close(); 89 90 // タイマーを生成 91 timerThis = new java.util.Timer(); 92 // タイマーをスタート 93 timerThis.scheduleAtFixedRate(new TimerActionTimerTask(), 1000l, 16l); 94 95 } catch (Exception ex) { 96 ex.printStackTrace(); 97 JOptionPane.showMessageDialog(this, "ERROR : " + ex.toString()); 98 } 99 100 } // end MGPanel 101 102 /** 103 * 実行 104 */ 105 public void run() { 106 107 // やられている場合 108 if (timeM != 0) { 109 110 // 時間を-1にする 111 timeM--; 112 113 // 時間が0になったら 114 if (timeM == 0) { 115 116 // 新しいもぐらを表示する 117 m = 0; 118 119 mx = (int) (Math.random() * 550); 120 my = (int) (Math.random() * 450); 121 122 } // end if 時間が0になったら 123 124 } // end if やられている場合 125 126 } // end run 127 128 /** 129 * 描画メソッド 130 * <pre> 131 * ペイントする必要がある時にこのメソッドが呼び出されます 132 * </pre> 133 */ 134 public void paint(Graphics g) { 135 136 // 画面を塗りつぶす 137 g.setColor(Color.black); 138 g.fillRect(0, 0, 800, 600); 139 140 // もぐらを描画する 141 g.drawImage(imageMs[m], mx, my, 100, 100, this); 142 143 // ピコピコハンマーを描画する 144 g.drawImage(imagePHs[ph], px, py, 100, 88, this); 145 146 } // end paint 147 148 /** 149 * マウスアダプタ 150 */ 151 private class MGMouseAdapter extends MouseAdapter { 152 153 /** 154 * マウスが押された時に呼ばれます 155 */ 156 public void mousePressed(MouseEvent me) { 157 158 // ピコピコハンマーを叩く 159 ph = 1; 160 // 場所を記憶する 161 px = me.getX() - 100; 162 py = me.getY() - 100; 163 164 // もぐらとの当たり判定(mx350,my200) 165 if (px > mx - 50 && px < mx + 90 && py > my - 70 && py < my + 60) { 166 // やられた 167 m = 1; 168 timeM = 30; 169 } 170 171 } // end mousePressed 172 173 /** 174 * マウスが離された時に呼ばれます 175 */ 176 public void mouseReleased(MouseEvent me) { 177 178 // ピコピコハンマーを上げる 179 ph = 0; 180 // 場所を記憶する 181 px = me.getX() - 100; 182 py = me.getY() - 100; 183 184 } // end mouseReleased 185 186 /** 187 * マウスが移動された時に呼ばれます 188 */ 189 public void mouseMoved(MouseEvent me) { 190 191 // 場所を記憶する 192 px = me.getX() - 100; 193 py = me.getY() - 100; 194 195 } // end mouseMoved 196 197 /** 198 * マウスがドラッグされた時に呼ばれます 199 */ 200 public void mouseDragged(MouseEvent me) { 201 202 // 場所を記憶する 203 px = me.getX() - 100; 204 py = me.getY() - 100; 205 206 } // end mouseDragged 207 208 } // end MGMouseAdapter 209 210 /** 211 * タイマークラス 212 */ 213 private class TimerActionTimerTask extends TimerTask { 214//このクラスのについて質問があります。 215 public void run() { 216 217 // 実行メソッド呼び出し 218 MGPanel.this.run(); 219 220 // 描画する 221 repaint(); 222 223 } // end actionPerformed 224 225 } // end TimerActionTimerTask 226 227} 228

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

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

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

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

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

guest

回答1

0

ベストアンサー

MGPanelコンストラクタの次の部分でタスクを登録しています。
TimerActionTimerTask#runメソッドはTimerインスタンスが適切な間隔で呼び出してくれます。

Java

// タイマーを生成
timerThis = new java.util.Timer();
// タイマーをスタート
timerThis.scheduleAtFixedRate(new TimerActionTimerTask(), 1000l, 16l);

Timer#scheduleAtFixedRateの引数の意味については、リファレンスを引けば分かります。

public void scheduleAtFixedRate​(TimerTask task, long delay, long period)

指定したタスクが、指定した遅延のあとに開始され、固定頻度実行を繰り返すようにスケジュールします。 そのあとは、指定した期間とは別に、ほぼ一定の間隔で実行されます。

パラメータ:

  • task - スケジュールされるタスク。
  • delay - タスクが実行される前のミリ秒単位の遅延。
  • period - 連続するタスクが実行されるミリ秒単位の間隔。

引用元: Timer (Java SE 10 & JDK 10 ) - scheduleAtFixedRate(java.util.TimerTask,long,long)

実験

できるだけミニマムなコードで使い方を確かめておくと理解が進みます。
値をいろいろといじって挙動を調べてみると良いでしょう。Wandbox

Java

1import java.util.*; 2 3 4class Main { 5 public static void main(String[] args) { 6 Timer timer = new Timer(); 7 8 System.out.println(System.currentTimeMillis()); 9 timer.scheduleAtFixedRate(new MyTimerTask(), 1000L, 100L); 10 11 try { Thread.sleep(10000); } catch(InterruptedException e) { e.printStackTrace(); } 12 timer.cancel(); 13 } 14} 15 16class MyTimerTask extends TimerTask { 17 @Override 18 public void run() { 19 System.out.println(System.currentTimeMillis()); 20 } 21}

投稿2019/01/06 13:09

編集2019/01/06 13:19
LouiS0616

総合スコア35660

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

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

Chandler_Bing

2019/01/06 13:22

ありがとうごおざいます。大変よく理解できました。感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問