🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

1回答

515閲覧

カウントダウンの途中に別のクラスのスレッドが開始してしまいます。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2020/01/05 07:37

##実現したいこと
ブロック崩しとの関連性がないプログラムコードですが、このサイトに自分がやりたかったことがあったので引用しました。
実現したいことは、いまこのプログラムのカウントダウンが終わったら、ゲーム本体のスレッドを開始したいと思っております。
つまり、5秒たったらこのプログラムは終了し、別のゲームのほうに移りたいと考えています。
しかし、カウントダウン中にも、ゲーム本体のスレッドが開始してしまい、制限時間が40秒と設定したところ、36秒となってしまいます。前回の質問の通り、ブロック崩し本体のコードは長くて載せられない状況となっています。
実際に自分が変えていることは、カウントダウンが―1となったら、別のクラスbreakoutクラスに返したいと思っています。ブロック崩し本体のスレッドのsleepメソッドは20と指定しています。

java

1import java.awt.CardLayout; 2 3import javax.swing.JFrame; 4import javax.swing.JLabel; 5import javax.swing.JPanel; 6 7import javax.swing.Timer; 8import java.awt.Color; 9 10@SuppressWarnings("serial") 11public class TimerTest1 extends JFrame { 12 static int x=855; 13static int y=800; 14 private Timer timer; 15 private int countdown_sec = 5; 16 private CardLayout card = new CardLayout(0, 0); 17 18 public static void main(String[] args) { 19 20 21 TimerTest1 frame = new TimerTest1(); 22 23 frame.setSize(x,y); 24 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 25 frame.getContentPane().setBackground(new Color(0, 0, 0)); 26 breakout panel= new breakout(); 27 28 29 frame.add(panel); 30 31 frame.setVisible(true); 32 33 } 34 35 TimerTest1() { 36 // setDefaultCloseOperationは一番先頭で 37 38 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 39 setTitle("タイトル画面"); 40 setLayout(card); 41 42 JPanel labelPanel = new JPanel(); 43 JLabel label = new JLabel(); 44 JPanel game_over = new breakout(); 45 game_over.setOpaque(false); 46 47 labelPanel.add(label); 48 add(labelPanel, "title_window"); 49 timer = new Timer(1000, (e) -> { 50 label.setText(String.valueOf(countdown_sec)); 51 if (countdown_sec ==-1){ 52 add(game_over, "gameover_window"); 53 timer.stop(); 54 55 showPanel("gameover_window"); 56 57 return; 58 } 59 countdown_sec--; 60 }); 61 62 63 64 65 timer.start(); 66 67 68 } 69 70 public void showPanel(String name) { 71 card.show(getContentPane(), name); 72 } 73}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Timer は start すれば開始されます. コンストラクタで start していますので, new したらタイマーがスタートすることになります.
breakout クラスのコンストラクタがどうなっているのかが分かりませんが, 同様にコンストラクタから開始することになっているとすれば, タイマーと同時に breakout が開始されるのは「コード通り」です.

breakout をコンストラクタでは開始しないようにし, (Timer のように) start メソッド(を新設してそれ)を呼ぶと開始するようにし, 5秒たったら breakout を表示すると同時に start メソッドを呼ぶようにすると良いのではないでしょうか.

投稿2020/01/05 08:54

jimbe

総合スコア13204

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

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

退会済みユーザー

退会済みユーザー

2020/01/05 09:03

すいません。二回に分けてコードを出そうと思います。もしできれば見てくれますようお願いしたいです。
jimbe

2020/01/05 09:24

breakout のコードでしたら, 必ずしも必要ありません. むしろ, ご質問と関係無いゲーム本体を長々と載せられても, 恐らく回答側は全部は調べないでしょう. 現状で必要な情報は, breakout が new breakout() した時点で開始するということだけで, それはご質問から推測できるからです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問