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

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

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

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

Q&A

1回答

1311閲覧

Java初心者:ゲームオーバー画面にボタンを2つ実装したいです

Koushikun

総合スコア6

Java

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

0グッド

0クリップ

投稿2018/01/23 01:36

編集2018/01/23 01:59

Java初心者の質問です。
こちらのサイト ( https://www.javadrive.jp/tutorial/timer/index1.html https://www.javadrive.jp/tutorial/event/index2.html ) を参考にタイマーが5から順にカウントダウンしていき、-1になった瞬間に"GameOver"と"Score"を表示するようにして(Game.java, GameOver.java)、次のステップとしてゲームオーバー画面にJButtonでボタンを2つ実装(クリックするとプログラム終了するボタンともう一度Game.javaを実行するボタン)したいのですが、既存のプログラムに対してどのようにJButtonを実装すればよいかわからずに困っております)

以下、ソースコードです。
(Game.javaを実行し、Game.java内でGameOver.javaを呼び出しています)

----------Game.java---------------

import java.awt.CardLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Game extends JFrame {

private Timer timer; private int countdown_sec = 5; private CardLayout card = new CardLayout(0, 0); public static void main(String[] args) { SwingUtilities.invokeLater(() -> { Game frame = new Game(); frame.setBounds(10, 10, 800, 800); frame.setVisible(true); }); } Game() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("CountDown画面"); setLayout(card); JPanel labelPanel = new JPanel(); JLabel label = new JLabel(); labelPanel.add(label); add(labelPanel, "title_window"); timer = new Timer(1000, (e) -> { label.setText(String.valueOf(countdown_sec)); if (countdown_sec ==-1){ timer.stop(); showPanel("gameover_window"); return; } countdown_sec--; }); JPanel game_over = new GameOver(); add(game_over, "gameover_window"); timer.start(); } public void showPanel(String name) { card.show(getContentPane(), name); }

}


----------GameOver.java-------------

import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Color;

public class GameOver extends JPanel {

public GameOver() { //背景を黄色にする。 setBackground(Color.YELLOW); setLayout(new BorderLayout(0, 0)); JLabel lblGameOver = new JLabel("GameOver"); // 文字色を赤色にする。 lblGameOver.setForeground(Color.RED); lblGameOver.setVerticalAlignment(SwingConstants.TOP); lblGameOver.setHorizontalAlignment(SwingConstants.CENTER); add(lblGameOver, BorderLayout.NORTH); JLabel lblScore = new JLabel("Score"); lblScore.setForeground(Color.RED); lblScore.setHorizontalAlignment(SwingConstants.CENTER); add(lblScore);

//JButtonをここで2つ実装したい
}
}


-----------上記のGameOver.javaファイルに実装したい内容(2つのボタンの実装)-----------
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.BorderLayout;

class SSample1_1 extends JFrame{
public static void main(String args[]){
SSample1_1 frame = new SSample1_1("タイトル");
frame.setVisible(true);
}

SSample1_1(String title){
setTitle(title);
setBounds(100, 100, 300, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel p = new JPanel(); JButton button1 = new JButton("リトライ");//クリックするとGame.javaをもう一度実行するようにしたい JButton button2 = new JButton("終了");//クリックすると強制終了するようにしたい p.add(button1); p.add(button2); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER);

}
}


制作環境はeclipseを使用しております。

どなたかご教授お願いします。

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

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

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

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

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

guest

回答1

0

###表示制御

このプログラムはCardLayoutを用いています。CardLayoutの機能(振る舞い)とそれを制御する方法はCardLayoutのリファレンスを見れば解説があります。それを参考にしてみてください。プログラム上にポイントとなる処理がありますが、それは

card.show(getContentPane(), name);

複数の子供の中からshowの第二引数で指定した名前を持つ子供のみを表示してくれるのがCardLayoutの働きです。ゆえに最初に表示された画面に戻したいなら

card.show(コンテントペーン, "title_window");

のように表示対象を切り替えればよいです。コード上に「コンテントペーン」なんてカタカナで書きましたがその理由はGameOverクラスで

card.show(getContentPane(), "title_window");

とはかけないからです。書き方は何通りかありますがGameOverクラス内のインスタンスメソッド(あるはコンストラクター)に記述するなら(GameOverインスタンスの親がコンテントペーンなので)以下でよいかと思います。

card.show(getParent(), "title_window");

###再初期化
もう一度ゲームを開始するには再度初期化すべき点があります。それはTimerです。GameOver画面が表示されたタイミングではTimerはstopされてます。これを再度動かすにはrestart()すればよいでしょう。

投稿2018/01/23 02:45

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問