前提
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クラスになります。
回答2件
あなたの回答
tips
プレビュー