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

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

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

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

Q&A

解決済

2回答

914閲覧

他クラスで設定したメソッドを呼び出しているが機能していない

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

1グッド

0クリップ

投稿2023/01/13 05:49

編集2023/01/13 07:17

前提

JavaのGUI(Swing)を使ってポートフォリオを作成しています。
GamePanelクラスで記述したresetGameメソッドを他クラスで呼び出しているつもりですが
機能しません。(GamePanelクラス中では機能しているようです。)

実現したいこと

TitlePanelクラス中でresetGameメソッドを呼び出し機能させスペースキーで画面遷移するたびに
GamePanelが初期化されているようにしたいです。

発生している問題・エラーメッセージ

該当のソースコード

Java

1package mainPackage; 2 3import java.awt.BorderLayout; 4import java.awt.Color; 5import java.awt.event.ActionEvent; 6import java.awt.event.ActionListener; 7import java.awt.event.KeyEvent; 8import java.awt.event.KeyListener; 9 10import javax.swing.JPanel; 11import javax.swing.Timer; 12 13public class GamePanel extends JPanel implements ActionListener{ 14 private static final long serialVersionUID = 1L; 15 16 //フィールド 17 int restTime; 18 Timer timer; 19 20 //レイアウト 21 BorderLayout layout = new BorderLayout(); 22 //コンポーネント 23 MenuBar menuBar; 24 FieldPanel fieldPanel; 25 26 //リスナー 27 MyKeyListener myKeyListener; 28 29 GamePanel(){ 30 this.setLayout(layout); 31 this.setBackground(Color.yellow); 32 //パネルの生成と設置 33 menuBar = new MenuBar(); 34 fieldPanel = new FieldPanel(); 35 timer = new Timer(60000,this); 36 this.add(menuBar,BorderLayout.NORTH); 37 this.add(fieldPanel,BorderLayout.CENTER); 38 timer.start(); 39 } 40 41 public void prepareComponents() { 42 43 menuBar.prepareComponents(); 44 fieldPanel.prepareComponents(); 45 46 myKeyListener = new MyKeyListener(this); 47 } 48 49 public void resetGame() { 50 this.fieldPanel.removeAll(); 51 this.fieldPanel.prepareComponents(); 52 } 53 54 public void actionPerformed(ActionEvent e) { 55 Main.mainWindow.setFrontScreenAndFocus(ScreenMode.TITLE); 56 resetGame(); 57 } 58 59 //内部クラス 60 private class MyKeyListener implements KeyListener{ 61 //貼り付け先の保持 62 JPanel panel; 63 64 //コンストラクタ 65 MyKeyListener(JPanel p){ 66 super(); 67 panel = p; 68 panel.addKeyListener(this); 69 } 70 @Override 71 public void keyTyped(KeyEvent e) { 72 //do nothing 73 } 74 @Override 75 public void keyReleased(KeyEvent e) { 76 //do nothing 77 } 78 @Override 79 public void keyPressed(KeyEvent e) { 80 switch(e.getKeyCode()) { 81 case KeyEvent.VK_H://Hを押したとき 82 Main.mainWindow.setFrontScreenAndFocus(ScreenMode.TITLE); 83 resetGame(); 84 } 85 } 86 } 87}

Java

1package mainPackage; 2 3import java.awt.Color; 4import java.awt.Font; 5import java.awt.event.KeyEvent; 6import java.awt.event.KeyListener; 7 8import javax.swing.BorderFactory; 9import javax.swing.JLabel; 10import javax.swing.JPanel; 11import javax.swing.SwingConstants; 12import javax.swing.border.Border; 13 14public class TitlePanel extends JPanel{ 15 private static final long serialVersionUID = 1L; 16 17 JLabel title; 18 JLabel start; 19 JLabel exit; 20 JLabel select; 21 JLabel message; 22 Menu checkMenu = Menu.START; 23 Border border = BorderFactory.createLineBorder(Color.BLACK,2);//消してもよい 24 MyKeyListener myKeyListener; 25 GamePanel gamePanel = new GamePanel(); 26 FieldPanel fieldPanel; 27 //列挙型 28 public enum Menu{ 29 START, 30 EXIT, 31 } 32 33 TitlePanel(){ 34 35 this.setLayout(null); 36 this.setBackground(Color.cyan); 37 } 38 39 public void prepareComponents() { 40 title = new JLabel(); 41 42 43 44 //ImageIcon titleLogo = new ImageIcon(getClass().getClassLoader()getResource("title.png"));//600×300の画像を想定 45 //title.setIcon(titleLogo); 46 title.setHorizontalAlignment(SwingConstants.CENTER); 47 title.setVerticalAlignment(SwingConstants.BOTTOM); 48 title.setText("Created by 【TAKAYUKI H】"); 49 title.setHorizontalTextPosition(JLabel.CENTER); 50 title.setVerticalTextPosition(SwingConstants.BOTTOM); 51 title.setBounds(90,0,600,350); 52 title.setBorder(border); 53 //this.add(titleLabel); 54 55 //選択肢 56 start = new JLabel(); 57 start.setText("START"); 58 start.setFont(new Font("MV boli",Font.BOLD,40)); 59 start.setHorizontalTextPosition(JLabel.CENTER); 60 start.setVerticalTextPosition(JLabel.BOTTOM); 61 start.setBounds(330,400,150,40); 62 start.setBorder(border);//縁取り 63 64 exit = new JLabel(); 65 exit.setText("EXIT"); 66 exit.setFont(new Font("MV boli",Font.BOLD,40)); 67 exit.setHorizontalTextPosition(JLabel.CENTER); 68 exit.setVerticalTextPosition(JLabel.BOTTOM); 69 exit.setBounds(350,450,110,40); 70 exit.setBorder(border);//縁取り 71 72 //選択アイコン 73 select = new JLabel(); 74 //ImageIcon titleLogo = new ImageIcon(getClass().getClassLoader()getResource("some.png")); 75 //title.setIcon(selectIcon); 76 select.setBackground(Color.blue); 77 select.setOpaque(true); 78 select.setBounds(280,400,40,40); 79 select.setBorder(border); 80 81 //説明 82 message = new JLabel(); 83 message.setHorizontalAlignment(SwingConstants.CENTER); 84 message.setText("選択: ↑,↓ 決定:SPACE"); 85 message.setVerticalTextPosition(JLabel.CENTER); 86 message.setHorizontalTextPosition(JLabel.CENTER); 87 message.setBounds(249,517,300,30); 88 message.setBorder(border); 89 90 //配置 91 this.setLayout(null); 92 this.add(title); 93 this.add(start); 94 this.add(exit); 95 this.add(select); 96 this.add(message); 97 98 //リスナーの設定 99 myKeyListener = new MyKeyListener(this); 100 101 } 102 103 private class MyKeyListener implements KeyListener{ 104 //貼り付け先を保持 105 TitlePanel panel; 106 107 //コンストラクタ 108 MyKeyListener(TitlePanel p){ 109 super(); 110 panel = p; 111 panel.addKeyListener(this); 112 } 113 @Override 114 public void keyTyped(KeyEvent e) { 115 //do nothing 116 } 117 118 @Override 119 public void keyReleased(KeyEvent e) { 120 //do nothing 121 } 122 123 @Override 124 public void keyPressed(KeyEvent e) { 125 switch(e.getKeyCode()) { 126 127 case KeyEvent.VK_DOWN: 128 if(checkMenu == Menu.START) { 129 select.setLocation(select.getX(),select.getY()+50); 130 checkMenu = Menu.EXIT; 131 } 132 break; 133 case KeyEvent.VK_UP: 134 if(checkMenu == Menu.EXIT) { 135 select.setLocation(select.getX(),select.getY()-50); 136 checkMenu = Menu.START; 137 } 138 break; 139 140 case KeyEvent.VK_SPACE: 141 if(checkMenu == Menu.START) { 142 Main.mainWindow.setFrontScreenAndFocus(ScreenMode.GAME); 143 gamePanel.resetGame(); 144 }else if(checkMenu == Menu.EXIT) { 145 //終了 146 System.exit(0); 147 } 148 break; 149 } 150 } 151 } 152} 153 154

Java

1package mainPackage; 2 3public class Main{ 4 static MainWindow mainWindow; 5 public static void main(String[] args) { 6 mainWindow = new MainWindow(); 7 mainWindow.preparePanels(); 8 mainWindow.prepareComponents(); 9 mainWindow.setFrontScreenAndFocus(ScreenMode.TITLE); 10 11 mainWindow.setVisible(true); 12 } 13}

Java

1package mainPackage; 2 3import java.awt.CardLayout; 4import java.awt.Color; 5import java.awt.Dimension; 6 7import javax.swing.JFrame; 8 9public class MainWindow extends JFrame{ 10 private static final long serialVersionUID = 1L; 11 12 ScreenMode screenMode = ScreenMode.GAME; 13 14 final int WIDTH = 800; 15 final int HEIGHT = 600; 16 17 CardLayout layout = new CardLayout(); 18 19 TitlePanel titlePanel; 20 GamePanel gamePanel; 21 22 MainWindow(){ 23 this.setTitle("SheepInComa"); 24 //ImageIcon icon = new ImageIcon(getClass().getClassLoader().getResource(null)); 25 //this.setIconImage(icon.getImage()); 26 27 this.setDefaultCloseOperation(EXIT_ON_CLOSE); 28 this.setResizable(false); 29 this.getContentPane().setBackground(Color.green); 30 this.setLayout(layout); 31 this.setPreferredSize(new Dimension(WIDTH,HEIGHT)); 32 this.pack(); 33 this.setLocationRelativeTo(null); 34 } 35 36 public void preparePanels(){ 37 38 titlePanel = new TitlePanel(); 39 this.add(titlePanel,"タイトル画面"); 40 gamePanel = new GamePanel(); 41 this.add(gamePanel,"ゲーム画面"); 42 this.pack(); 43 } 44 45 public void prepareComponents() { 46 titlePanel.prepareComponents(); 47 gamePanel.prepareComponents(); 48 49 } 50 51 public void setFrontScreenAndFocus(ScreenMode s) { 52 screenMode = s; 53 54 switch(screenMode) { 55 case TITLE: 56 layout.show(this.getContentPane(),"タイトル画面"); 57 titlePanel.requestFocus(); 58 break; 59 case GAME: 60 layout.show(this.getContentPane(),"ゲーム画面"); 61 gamePanel.requestFocus(); 62 break; 63 } 64 } 65 66}

試したこと

自分の知識で思いつく限りは試してみたつもりなのですが、なにか初歩的な見逃しをしている気がしてなりません。
上級者の視点からすれば他愛もないようなコードかもしれませんが、ご助言いただけると助かります。

補足情報(FW/ツールのバージョンなど)

1~88行目まではGamePanelクラス、
89行目からTitlePanelクラスになります。

TN8001😄を押しています

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

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

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

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

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

jimbe

2023/01/13 05:57

コードのご提示はファイル毎で分けてください。コピペしての確認時に編集が必要な場合、そこで間違いが起きて余計な時間が掛かる可能性があります。
退会済みユーザー

退会済みユーザー

2023/01/13 06:07

ご指摘のコメントありがとうございます。 修正を行いました。
jimbe

2023/01/13 06:32 編集

有難うございます。 TitlePanel の先頭20行程が編集に失敗されているようです。 teratail 上で編集するよりも、お手元のファイルの中身をまるごとコピペされたほうが確実ではないでしょうか。
退会済みユーザー

退会済みユーザー

2023/01/13 06:41

重ねて失礼しました。 修正しました。
int32_t

2023/01/13 06:44

> Main.mainWindow.setFrontScreenAndFocus(ScreenMode.GAME); この関数のコードの開示も必要かと思います。
退会済みユーザー

退会済みユーザー

2023/01/13 07:19

不慣れなものですみません。 Mainクラス MainWindowクラスを追記しました。
jimbe

2023/01/13 07:48

コードが増えましたね^^; 4ファイルをコピペしても全てにコンパイルエラーが出てますが…FieldPanel と ScreenMode かな? 思った以上に大きなプログラムだったようで。
退会済みユーザー

退会済みユーザー

2023/01/13 08:37

その通りです。申し訳ありませんでした。
guest

回答2

0

かなりクセのある状態になっています。
prepareComponent とか別にメソッドを用意しなくても(ましてコンストラクタの後に呼んで貰わなくても)、コンストラクタに並べてしまえば良いのです。
Main は main メソッドだけですので MainWindow に入れてしまえますし、 MainWindow のメソッドを呼ぶのであれば (static フィールドなど使用せず) その参照をコンストラクタで渡して使うほうが良いです。ScreenMode は無くても それぞれ呼ぶモノは決まっているのですから showTitle() とかで済みます。

MainWindow.java

java

1import java.awt.*; 2import java.awt.event.WindowEvent; 3 4import javax.swing.JFrame; 5import javax.swing.SwingUtilities; 6 7public class MainWindow extends JFrame { 8 public static void main(String[] args) { 9 SwingUtilities.invokeLater(() -> new MainWindow().setVisible(true)); 10 } 11 12 private static final int WIDTH = 800; 13 private static final int HEIGHT = 600; 14 15 private static final String TITLE_TAG = "タイトル画面"; 16 private static final String GAME_TAG = "ゲーム画面"; 17 18 private CardLayout layout = new CardLayout(); 19 private TitlePanel titlePanel; 20 private GamePanel gamePanel; 21 22 MainWindow() { 23 super("SheepInComa"); 24 setDefaultCloseOperation(EXIT_ON_CLOSE); 25 setPreferredSize(new Dimension(WIDTH, HEIGHT)); 26 setResizable(false); 27 setLayout(layout); 28 29 getContentPane().setBackground(Color.green); 30 31 titlePanel = new TitlePanel(this); 32 add(titlePanel, TITLE_TAG); 33 34 gamePanel = new GamePanel(this); 35 add(gamePanel, GAME_TAG); 36 37 showTitle(); 38 39 pack(); 40 setLocationRelativeTo(null); 41 } 42 43 void showTitle() { 44 layout.show(getContentPane(), TITLE_TAG); 45 titlePanel.requestFocus(); 46 } 47 48 void showGame() { 49 layout.show(getContentPane(), GAME_TAG); 50 gamePanel.requestFocus(); 51 } 52 53 void exit() { 54 dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); 55 } 56}

TitlePanel.java

java

1import java.awt.Color; 2import java.awt.Font; 3import java.awt.event.KeyEvent; 4import java.awt.event.KeyListener; 5 6import javax.swing.*; 7import javax.swing.border.Border; 8 9class TitlePanel extends JPanel { 10 private enum Menu { 11 START, EXIT, 12 } 13 private Menu checkMenu = Menu.START; 14 15 TitlePanel(MainWindow main) { 16 super(null); 17 setBackground(Color.cyan); 18 19 Font font = new Font("MV boli", Font.BOLD, 40); 20 Border selectBorder = BorderFactory.createLineBorder(Color.BLUE, 4); 21 Border unselectBorder = BorderFactory.createLineBorder(new Color(0,0,0,0), 4); 22 23 JLabel title = new JLabel("Created by 【TAKAYUKI H】"); 24 title.setHorizontalAlignment(SwingConstants.CENTER); 25 title.setVerticalAlignment(SwingConstants.BOTTOM); 26 title.setHorizontalTextPosition(JLabel.CENTER); 27 title.setVerticalTextPosition(SwingConstants.BOTTOM); 28 title.setBounds(90, 0, 600, 350); 29 add(title); 30 31 //選択肢 32 JLabel start = new JLabel("START"); 33 start.setFont(font); 34 start.setHorizontalAlignment(SwingConstants.CENTER); 35 start.setHorizontalTextPosition(JLabel.CENTER); 36 start.setVerticalTextPosition(JLabel.BOTTOM); 37 start.setBounds(330, 400, 150, 40); 38 start.setBorder(checkMenu == Menu.START ? selectBorder : unselectBorder); 39 add(start); 40 41 JLabel exit = new JLabel("EXIT"); 42 exit.setFont(font); 43 exit.setHorizontalAlignment(SwingConstants.CENTER); 44 exit.setHorizontalTextPosition(JLabel.CENTER); 45 exit.setVerticalTextPosition(JLabel.BOTTOM); 46 exit.setBounds(330, 450, 150, 40); 47 exit.setBorder(checkMenu == Menu.EXIT ? selectBorder : unselectBorder); 48 add(exit); 49 50 //説明 51 JLabel message = new JLabel("選択: ↑,↓ 決定:SPACE"); 52 message.setHorizontalAlignment(SwingConstants.CENTER); 53 message.setVerticalTextPosition(JLabel.CENTER); 54 message.setHorizontalTextPosition(JLabel.CENTER); 55 message.setBounds(249, 517, 300, 30); 56 add(message); 57 58 setFocusable(true); 59 addKeyListener(new KeyListener() { 60 @Override 61 public void keyPressed(KeyEvent e) { 62 switch (e.getKeyCode()) { 63 case KeyEvent.VK_DOWN: 64 if (checkMenu == Menu.START) { 65 start.setBorder(unselectBorder); 66 exit.setBorder(selectBorder); 67 checkMenu = Menu.EXIT; 68 } 69 break; 70 case KeyEvent.VK_UP: 71 if (checkMenu == Menu.EXIT) { 72 start.setBorder(selectBorder); 73 exit.setBorder(unselectBorder); 74 checkMenu = Menu.START; 75 } 76 break; 77 78 case KeyEvent.VK_SPACE: 79 if(checkMenu == Menu.START) { 80 main.showGame(); 81 } else if(checkMenu == Menu.EXIT) { 82 main.exit(); 83 } 84 break; 85 } 86 } 87 88 @Override 89 public void keyTyped(KeyEvent e) {} 90 @Override 91 public void keyReleased(KeyEvent e) {} 92 }); 93 } 94}

GamePanel.java(中で使用しているクラスが分からないのでガワだけ)

java

1import java.awt.BorderLayout; 2import java.awt.Color; 3import java.awt.event.KeyEvent; 4import java.awt.event.KeyListener; 5 6import javax.swing.JPanel; 7import javax.swing.Timer; 8 9class GamePanel extends JPanel { 10 GamePanel(MainWindow main) { 11 super(new BorderLayout()); 12 setBackground(Color.yellow); 13 14 //MenuBar menuBar = new MenuBar(); 15 //menuBar.prepareComponents(); 16 //add(menuBar, BorderLayout.NORTH); 17 18 //FieldPanel fieldPanel = new FieldPanel(); 19 //fieldPanel.prepareComponents(); 20 //add(fieldPanel, BorderLayout.CENTER); 21 22 setFocusable(true); 23 addKeyListener(new KeyListener() { 24 @Override 25 public void keyPressed(KeyEvent e) { 26 switch(e.getKeyCode()) { 27 case KeyEvent.VK_H://Hを押したとき 28 main.showTitle(); 29 resetGame(); 30 } 31 } 32 @Override 33 public void keyTyped(KeyEvent e) {} 34 @Override 35 public void keyReleased(KeyEvent e) {} 36 }); 37 38 Timer timer = new Timer(60000, e -> { 39 main.showTitle(); 40 resetGame(); 41 }); 42 timer.start(); 43 } 44 45 void resetGame() { 46 //fieldPanel.removeAll(); 47 //fieldPanel.prepareComponents(); 48 } 49}

投稿2023/01/13 09:15

jimbe

総合スコア12648

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

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

0

ベストアンサー

詳しくコードを読んだわけではないですが、

  • TitlePanel#gamePanel の初期化
  • MainWindow#preparePanels() の中のコード

の2箇所で new GamePanel() が呼ばれるのはおかしい気がします。GamePanel のインスタンスは1つだけであるべきではないでしょうか。

TitlePanel#gamePanel は不要で、setFrontScreenAndFocus() の中で gamePanel.resetGame(); を呼ぶべきかもしれません。

投稿2023/01/13 07:28

int32_t

総合スコア20884

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

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

退会済みユーザー

退会済みユーザー

2023/01/13 07:58

ご指摘の通りsetFrontScreenAndFocus()の中にgamePanel.reset()を書き加えることで意図した通りの機能が実装できました。 resetGame()を呼び出し行うメソッド記述先が間違っていたようです。 非常に助かりました。ありがとうございました。
退会済みユーザー

退会済みユーザー

2023/01/13 10:11

jimbeさま コンストラクタとメソッドの別々に配置することの意味について疑問を感じてはいましたが、私は初心者も初心者なのでまずは参考先に従って書いていこうという方針でした。 今後、学習を進めて行く上でいただいたご意見も参考にしていこうと思います。 貴重なご意見ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問