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

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

ただいまの
回答率

90.52%

  • Java

    13778questions

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

Buttonの、アクションの書き方について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 228

akirasada1972

score 14

“ゲーム開始”のボタンを押すと、ゲームが始まるようにしたいのですが、できません。

    package luna.sexydesign;

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;

    class Subthread extends Thread {

        private ScreenToucher toucher1;

    public Subthread(ScreenToucher toucher1) {
        this.toucher1 = toucher1;
    }

    @Override
    public void run() {// TODO Auto-generated constructor stub
            try {
                sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    //        SwingUtilities.invokeLater(() ->
                    toucher1.setPanel4();
        }
    }

    public class ScreenToucher extends JFrame {

        int i = 0;
        static int width = 500;
        static int height = 500;
        private MyPanel1 p1;

        public static void main(String args[]) {

            ScreenToucher frame = new ScreenToucher("Screen Toucher");
            frame.setVisible(true);
       }

        ScreenToucher(String title) {
            setTitle(title);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, width, height);

            p1 = new MyPanel1();

            JPanel p2 = new JPanel();
            p2.setBackground(Color.gray);

            JButton btn = new JButton("ゲーム開始");
            btn.addActionListener(new ClickAction());
            p2.add(btn);

            add(p1, BorderLayout.NORTH);
            add(p2, BorderLayout.CENTER);

        }

        public void setCount(int count) {
            p1.setCount(count);
        }

        public void setPanel4(){
            MyPanel4 p4 = new MyPanel4();
            add(p4, BorderLayout.CENTER);
    }

    }

        class MyPanel1 extends JPanel {

        int i;

        private JLabel l1;

        MyPanel1() {
            JPanel p1 = new JPanel();

            l1 = new JLabel();
            p1.setBackground(Color.green);
            Integer j = new Integer(i);
            String text = j.toString();
            l1.setText(text);
            p1.add(l1);

            add(p1);
        }

        public void setCount(int count) {
            l1.setText(Integer.toString(count));
        }

        }

    class MyPanel3 extends JPanel {

        static int width = 500;
        static int height = 500;
        static int i = 0;
        static int r = 60;
        static int x;
        static int y;

        final static Color bc = Color.black;
        final static Color dc = Color.green;

        private ScreenToucher toucher2;

        public MyPanel3(ScreenToucher toucher2) {
            setBackground(Color.black);
            this.toucher2 = toucher2;
            MouseListener();
            repaint();
       }

        void MouseListener() {
            addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    double mouseX = e.getX();
                    double mouseY = e.getY();
                    if (mouseX > x && mouseX < x + 2 * r) {
                        if (mouseY > y && mouseY < y + 2 * r) {
                            repaint();
                            toucher2.setCount(Count());
                        }
                    }
                }
            });
        }

        protected void paintComponent(Graphics g) {
                super.paintComponent(g);
            x = (int) (Math.random() * width);
            y = (int) (Math.random() * height) + 30;
            if ((x < width - 2 * r) && (y < height - 2 * r)) {
                g.setColor(dc);
                g.fillOval(x, y, r, r);
            } else {
                repaint();
            }
        }

        int Count() {
            i += 100;
            return i;
        }

    }

    class MyPanel4 extends JPanel {

        public MyPanel4() {
            setBackground(new Color(0,0,0,100));
         }

        public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.setColor(Color.white);
                g.drawString("GAME OVER", 100, 200);
            }
        }

    class ClickAction implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            /**            
            Subthread thread = new Subthread(this);
            thread.start();

            MyPanel3 p3 = new MyPanel3(p1);
            add(p3, BorderLayout.CENTER);
             */
        }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

“ゲーム開始”のボタンを押すと、ゲームが始まるようにしたい

ClickAction#actionPerformedに何も記述していないからでは。。

ScreenToucherクラスのコンストラクタ内で、

public class ScreenToucher extends JFrame {
    private MyPanel1 p1;
    private Subthread thread;
    ScreenToucher(String title) {
        // 前略
        add(p2, BorderLayout.CENTER);
        thread = new Subthread(this);
        // startはこの時点では行わない。
    }
    // ClickActionを内部クラスに変更して
    class ClickAction implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            thread.start();
        }
    }
}

Swingでゲーム作成は

1,画面の遷移
1-a,表示したい画面毎にJPanelまたはJLayeredPaneを継承したクラスを作成する
この時paintComponentをオーバーライドすると、画面項目の座標計算を自力で行う必要が発生するので、パフォーマンスがシビアに求められている部分以外はできるだけオーバーライドしない。
文字列を表示したい時はJLabelを使う。
1-b,遷移処理はCardLayoutactionPerformedを使う。
参考:カウントダウン後に画面遷移をしたいです
ボタンが押されると画像が上書きされるプログラムを作りたい

2,ゲームの制限時間や定期的に処理を行いたい時
SwingEDT(Event Dispatch Thread)の関係上、Threadクラスを使わず、javax.swing.TimerSwingWorkerを使う。
3,画面作成はWindowBuilderを使う。

この3ルールを意識すると開発しやすいと思います。


ゆるふわで質問文のコードを書き換えました。サンプルコードです、ご参考まで。

import javax.swing.JFrame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

// ゲームモード
enum GameMode {
    MENU, PLAY, OVER,
}

public class ScreenToucher extends JFrame implements ActionListener {

    int i = 0;
    // private finalにして代入を抑止する
    private final static int width = 500;
    private final static int height = 500;
    private ScorePanel p1;
    private GameMode mode = GameMode.MENU;
    // CardLayoutを使って切り替え
    private final JPanel gamePanel = new JPanel(new CardLayout());
    private Timer timer; // タイマー

    public static void main(String args[]) {
        // mainスレッドなので、SwingUtilities#invokeLaterを使う。
        SwingUtilities.invokeLater(() -> {
            ScreenToucher frame = new ScreenToucher("Screen Toucher");
            frame.setVisible(true);
        });
    }

    ScreenToucher(String title) {
        setTitle(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, width, height);

        p1 = new ScorePanel();

        JPanel p2 = new JPanel();
        p2.setBackground(Color.gray);

        JButton btn = new JButton("ゲーム開始");
        btn.addActionListener(this);
        p2.add(btn);
        // カードレイアウトに登録
        gamePanel.add(p2, GameMode.MENU.name());
        gamePanel.add(new MyPanel3(this), GameMode.PLAY.name());
        gamePanel.add(new GameOverPanel(), GameMode.OVER.name());

        add(p1, BorderLayout.NORTH);
        add(gamePanel, BorderLayout.CENTER);
        // Subthreadクラスを削除して、javax.swing.Timerを使用
        // 10000ms=10秒後
        timer = new Timer(10000, (e) -> {
            showPanel(GameMode.OVER);
            // ゲームオーバー後になにかしたい時はtimerも意識する必要があります。
        });
        // ここではtimer#startをしない。
        // 最初はメニューを表示
        showPanel(GameMode.MENU);
    }

    public void setCount(int count) {
        p1.setCount(count);
    }

    public void showPanel(GameMode m) {
        final CardLayout card = (CardLayout) gamePanel.getLayout();
        card.show(gamePanel, m.name());
        this.mode = m; // パネル表示時にゲームモードを変更
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        switch (mode) {
        case MENU:
            // ゲーム開始ボタンをクリック時に画面遷移
            showPanel(GameMode.PLAY);
            // 制限時間タイマーを起動
            timer.start();
            break;
        default:
            // ゲームオーバー時に何らかの処理をしたいなら、caseの条件を追加して同じような形で。
            break;
        }
    }
}

// MyPanel1 → ScorePanelにクラス名を変更
class ScorePanel extends JPanel {

    int i;

    private JLabel l1;

    ScorePanel() {
        JPanel p1 = new JPanel();

        l1 = new JLabel();
        p1.setBackground(Color.green);
        Integer j = new Integer(i);
        String text = j.toString();
        l1.setText(text);
        p1.add(l1);

        add(p1);
    }

    public void setCount(int count) {
        l1.setText(Integer.toString(count));
    }

}

// クラス名はクリッカーの方が良いかもです。
class MyPanel3 extends JPanel {

    static int width = 500;
    static int height = 500;
    static int i = 0;
    static int r = 60;
    static int x;
    static int y;

    final static Color bc = Color.black;
    final static Color dc = Color.green;

    private ScreenToucher toucher2;

    public MyPanel3(ScreenToucher toucher2) {
        setBackground(Color.black);
        this.toucher2 = toucher2;
        MouseListener();
        repaint();
    }

    void MouseListener() {
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                double mouseX = e.getX();
                double mouseY = e.getY();
                if (mouseX > x && mouseX < x + 2 * r) {
                    if (mouseY > y && mouseY < y + 2 * r) {
                        repaint();
                        toucher2.setCount(Count());
                    }
                }
            }
        });
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        x = (int) (Math.random() * width);
        y = (int) (Math.random() * height) + 30;
        if ((x < width - 2 * r) && (y < height - 2 * r)) {
            g.setColor(dc);
            g.fillOval(x, y, r, r);
        } else {
            repaint();
        }
    }

    int Count() {
        i += 100;
        return i;
    }

}

// MyPanel4 →GameOverPanelに名前を変更
class GameOverPanel extends JPanel {

    public GameOverPanel() {
        setBackground(new Color(0, 0, 0, 100));
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.white);
        g.drawString("GAME OVER", 100, 200);
    }
}

あとクラス間でイベントの通知をしたい時はPropertyChangeListenerが使えます。
参考:他のクラスからJFrameのラベルのテキストを変更


カウントを初期化

public class ScreenToucher extends JFrame implements ActionListener {
    public void addCount() {
        p1.addCount();
    }
}

class ScorePanel extends JPanel {
    // privateに変数名をiからscoreに変更
    private int score = 0; 
    // finalで代入を抑止
    private final JLabel l1;

    ScorePanel() {
        JPanel p1 = new JPanel();
        l1 = new JLabel();
        p1.setBackground(Color.green);
        // 1行に
        l1.setText(Integer.toString(score));
        p1.add(l1);
        add(p1);
    }
    // addCountを追加
    public void addCount() {
        score += 100;
        l1.setText(Integer.toString(score));
    }
    // setCountで内部の変数を同期
    public void setCount(int count) {
        score = count;
        l1.setText(Integer.toString(score));
    }

}

class MyPanel3 extends JPanel {
    void MouseListener() {
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                        // 前略
                        repaint();
                        // Count()メソッドと変数:iは削除。
                        toucher2.addCount();
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/21 04:54

    ゲーム開始ボタンを、上に持っていき、ゲームを。もう一度できるようにしたのですが、得点を”0”に直すことができません。どのタイミングで、カウントを初期化したらよいのでしょうか?

    import javax.swing.JFrame;

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;

    // ゲームモード
    enum GameMode {
    MENU, PLAY, OVER,
    }

    public class ScreenToucher extends JFrame implements ActionListener {

    int i = 0;
    // private finalにして代入を抑止する
    private final static int width = 500;
    private final static int height = 500;
    private ScorePanel p1;
    private GameMode mode = GameMode.MENU;
    // CardLayoutを使って切り替え
    private final JPanel gamePanel = new JPanel(new CardLayout());
    private Timer timer; // タイマー

    public static void main(String args[]) {
    // mainスレッドなので、SwingUtilities#invokeLaterを使う。
    SwingUtilities.invokeLater(() -> {
    ScreenToucher frame = new ScreenToucher("Screen Toucher");
    frame.setVisible(true);
    });
    }

    ScreenToucher(String title) {
    setTitle(title);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, width, height);

    p1 = new ScorePanel();

    JPanel p2 = new JPanel();
    p2.setBackground(Color.gray);

    JButton btn = new JButton("ゲーム開始");
    btn.addActionListener(this);
    p1.add(btn);
    // カードレイアウトに登録
    gamePanel.add(p2, GameMode.MENU.name());
    gamePanel.add(new MyPanel3(this), GameMode.PLAY.name());
    gamePanel.add(new GameOverPanel(), GameMode.OVER.name());

    add(p1, BorderLayout.NORTH);
    add(gamePanel, BorderLayout.CENTER);
    // Subthreadクラスを削除して、javax.swing.Timerを使用
    // 10000ms=10秒後
    timer = new Timer(10000, (e) -> {
    showPanel(GameMode.OVER);
    // ゲームオーバー後になにかしたい時はtimerも意識する必要があります。
    });
    // ここではtimer#startをしない。
    // 最初はメニューを表示
    showPanel(GameMode.MENU);
    }

    public void setCount(int count) {
    p1.setCount(count);
    }

    public void showPanel(GameMode m) {
    final CardLayout card = (CardLayout) gamePanel.getLayout();
    card.show(gamePanel, m.name());
    this.mode = m; // パネル表示時にゲームモードを変更
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
    switch (mode) {
    case MENU:
    // ゲーム開始ボタンをクリック時に画面遷移
    showPanel(GameMode.PLAY);
    // 制限時間タイマーを起動
    timer.start();
    break;

    case OVER:
    showPanel(GameMode.PLAY);
    timer.start();
    break;

    default:
    // ゲームオーバー時に何らかの処理をしたいなら、caseの条件を追加して同じような形で。
    break;

    }
    }
    }

    // MyPanel1 → ScorePanelにクラス名を変更
    class ScorePanel extends JPanel {

    int i;

    private JLabel l1;

    ScorePanel() {
    JPanel p1 = new JPanel();

    l1 = new JLabel();
    p1.setBackground(Color.green);
    Integer j = new Integer(i);
    String text = j.toString();
    l1.setText(text);
    p1.add(l1);

    add(p1);
    }

    public void setCount(int count) {
    l1.setText(Integer.toString(count));
    }

    }

    // クラス名はクリッカーの方が良いかもです。
    class MyPanel3 extends JPanel {

    static int width = 500;
    static int height = 500;
    static int r = 60;
    static int i = 0;
    static int x;
    static int y;

    final static Color bc = Color.black;
    final static Color dc = Color.green;

    private ScreenToucher toucher2;

    public MyPanel3(ScreenToucher toucher2) {
    setBackground(Color.black);
    this.toucher2 = toucher2;
    MouseListener();
    repaint();
    }

    void MouseListener() {
    addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
    double mouseX = e.getX();
    double mouseY = e.getY();
    if (mouseX > x && mouseX < x + 2 * r) {
    if (mouseY > y && mouseY < y + 2 * r) {
    repaint();
    toucher2.setCount(Count());
    }
    }
    }
    });
    }

    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    x = (int) (Math.random() * width);
    y = (int) (Math.random() * height) + 30;
    if ((x < width - 2 * r) && (y < height - 2 * r)) {
    g.setColor(dc);
    g.fillOval(x, y, r, r);
    } else {
    repaint();
    }
    }

    int Count() {
    i += 100;
    return i;
    }

    }

    // MyPanel4 →GameOverPanelに名前を変更
    class GameOverPanel extends JPanel {

    public GameOverPanel() {
    setBackground(new Color(0, 0, 0, 100));
    }

    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.white);
    g.drawString("GAME OVER", 100, 200);
    }
    }

    キャンセル

  • 2018/08/21 05:13 編集

    @akirasada1972さんへ
    ニアピン賞というか少し惜しいです。
    こんな感じにスコアのクリア処理を入れるといいです。
    case OVER:
    setCount(0); // ←この行がないです。
    showPanel(GameMode.PLAY);
    timer.start();
    break;
    あとこの欄は他の回答者の目に付きづらいので、やりたいことと今どういう状態(コンパイルエラー/実行エラー/その他)なのかを明確にして質問文を編集していただけると助かります。
    ペイントでラフ画面を書いて質問文に追記するのも一つの手かと。

    キャンセル

  • 2018/08/21 05:43

    @akirasada1972さんへ
    回答編集しましたこんな感じです。
    そのまま使うのではなく、どうして動くのかをSystem.out.printlnをactionPerformedやTimerの所に入れて動作確認してみてくださいな。

    キャンセル

+1

まずゲームが開始しているかbooleanかなんかで変数を作り、
ボタンが押されたら変数の値をゲーム開始と同じ状態にし、
paintComponentの中にif文を入れ、描画すればいいかと。
ただ、これからボタンが増える可能性を考えると、確かどっかにどのボタンが押されたのか判定する関数があったはず・・・
(知識不足ですいません。わからなかったら返信ください。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/20 07:37

    ボタンで、閉じることは、できるのですが、画面を、書き直すことが、できません。

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    public class ScreenToucher
    {
    public static void main(String args[])
    {
    JFrame frame = new JFrame("ScreenToucher");
    ButtonPanel bpanel =
    new ButtonPanel();
    frame.getContentPane().add(bpanel);
    frame.setSize(500,550);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(
    JFrame.EXIT_ON_CLOSE);
    }
    }
    class ButtonPanel extends JPanel
    {
    JButton b1 = new JButton("Start");
    JLabel l =new JLabel("0");
    JButton b2 = new JButton("End");
    MyPanel p = new MyPanel();
    public ButtonPanel()
    {
    setBackground(Color.white);
    JPanel p1 = new JPanel();
    p1.setPreferredSize(new Dimension(500,50));
    p1.setLayout(new GridLayout(1,3,20,10));
    JPanel p2 = new JPanel();
    p2.setPreferredSize(new Dimension(500,500));
    p1.add(b1);
    p1.add(l);
    p1.add(b2);
    p2.setLayout(new GridLayout(1,1));
    p2.add(p);
    add(p1, BorderLayout.NORTH);
    add(p2, BorderLayout.CENTER);
    b1.addActionListener(new Listener1());
    b2.addActionListener(new Listener2());
    }
    public class Listener1 implements ActionListener
    {
    public void actionPerformed(ActionEvent e)
    {
    if(e.getSource() == b1){
    p = new MyPanel();
    }
    }
    }
    public class Listener2 implements ActionListener
    {
    public void actionPerformed(ActionEvent e)
    {
    if(e.getSource() == b2)
    System.exit(0);
    }
    }
    }
    class MyPanel extends JPanel {

    static int width = 500;
    static int height = 500;
    static int i = 0;
    static int r = 60;
    static int x;
    static int y;

    final static Color bc = Color.black;
    final static Color dc = Color.green;

    public MyPanel() {
    setBackground(Color.black);
    MouseListener();
    repaint();
    }

    void MouseListener() {
    addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
    double mouseX = e.getX();
    double mouseY = e.getY();
    if (mouseX > x && mouseX < x + 2 * r) {
    if (mouseY > y && mouseY < y + 2 * r) {
    repaint();
    }
    }
    }
    });
    }

    protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    x = (int) (Math.random() * width);
    y = (int) (Math.random() * height) + 30;
    if ((x < width - 2 * r) && (y < height - 2 * r)) {
    g.setColor(dc);
    g.fillOval(x, y, r, r);
    } else {
    repaint();
    }
    }

    int Count() {
    i += 100;
    return i;
    }

    }

    キャンセル

  • 2018/08/21 00:29

    if(e.getSource() == b1){
    p = new MyPanel();
    }
    このifの中にadd( p ); すれば行けると思います。(ためしてないのでちがったらすいません。)

    キャンセル

check解決した方法

0

皆さんのアドバイスを、参考にして、無事完成させることが、できました。
ありがとうございましした。

import javax.swing.JFrame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

// ゲームモード
enum GameMode {
    MENU, PLAY, OVER,
}

public class ScreenToucher extends JFrame {

    int i = 0;
    // private finalにして代入を抑止する
    private final static int width = 500;
    private final static int height = 500;
    private GameMode mode = GameMode.MENU;
    // CardLayoutを使って切り替え
    private final JPanel gamePanel = new JPanel(new CardLayout());
    // finalで代入を抑止
    public static JLabel l1;
    private int score = 0;

        public static Timer timer; // タイマー

    JButton btn1 = new JButton("ゲーム開始");
    JButton btn2 = new JButton("ゲーム終了");

    public static void main(String args[]) {
        // mainスレッドなので、SwingUtilities#invokeLaterを使う。
        SwingUtilities.invokeLater(() -> {
            ScreenToucher frame = new ScreenToucher("Screen Toucher");
            frame.setVisible(true);
        });
    }

    ScreenToucher(String title) {

        setTitle(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, width, height);

    JPanel p1 =new JPanel();
    p1.setLayout(new GridLayout(1,3,20,10));

    JPanel p2 = new JPanel();
    p2.setBackground(Color.gray);

        btn1.addActionListener(new Listener1());
        p1.add(btn1);

        l1 = new JLabel();
        // 1行に
        l1.setText("0");
        p1.add(l1);

    btn2.addActionListener(new Listener2());
    p1.add(btn2);

        // カードレイアウトに登録
        gamePanel.add(p2, GameMode.MENU.name());
        gamePanel.add(new MyPanel3(this), GameMode.PLAY.name());
        gamePanel.add(new GameOverPanel(), GameMode.OVER.name());


        add(p1, BorderLayout.NORTH);
        add(gamePanel, BorderLayout.CENTER);

        // Subthreadクラスを削除して、javax.swing.Timerを使用
        // 10000ms=10秒後
        timer = new Timer(10000, (e) -> {
        showPanel(GameMode.OVER);
    });
        // ここではtimer#startをしない。
    showPanel(GameMode.MENU);
}

    public void addCount() {
        score += 100;
        l1.setText(Integer.toString(score));
    }

    // setCountで内部の変数を同期
    void setCount(int count) {
        score = count;
            l1.setText(Integer.toString(score));
    }

    public void showPanel(GameMode m) {
            final CardLayout card = (CardLayout) gamePanel.getLayout();
            card.show(gamePanel, m.name());
            this.mode = m; // パネル表示時にゲームモードを変更
    }


    public class Listener1 implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            if(e.getSource()==btn1) {
            setCount(0);
            showPanel(GameMode.PLAY);
            timer.start();
           }
         }
    }

    public class Listener2 implements ActionListener {

        public void actionPerformed(ActionEvent e) {

        if(e.getSource()==btn2) {

            System.exit(0);

        }
        }
    }
}
// クラス名はクリッカーの方が良いかもです。
class MyPanel3 extends JPanel {

    static int width = 500;
    static int height = 500;
    static int r = 60;
    static int i = 0;
    static int x;
    static int y;

    final static Color bc = Color.black;
    final static Color dc = Color.magenta;

    private ScreenToucher toucher;
    // privateに変数名をiからscoreに変更
    private int count = 0;

     public MyPanel3(ScreenToucher toucher) {
     setBackground(bc);
        this.toucher = toucher;
    MouseListener();
        repaint();
    }

    void MouseListener() {
        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                double mouseX = e.getX();
                double mouseY = e.getY();
                if (mouseX > x && mouseX < x + 2 * r) {
                    if (mouseY > y && mouseY < y + 2 * r) {
                        repaint();
            toucher.addCount();
                    }
                }
            }
        });
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        x = (int) (Math.random() * width);
        y = (int) (Math.random() * height) + 30;
        if ((x < width - 2 * r) && (y < height - 2 * r)) {
            g.setColor(dc);
            g.fillOval(x, y, r, r);
        } else {
            repaint();
        }
    }
}

// MyPanel4 →GameOverPanelに名前を変更
class GameOverPanel extends JPanel {

    public GameOverPanel() {
        setBackground(new Color(0, 0, 0, 100));
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.white);
        g.drawString("GAME OVER", 100, 200);
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13778questions

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