###前提・実現したいこと
(例)Java(UIはJFrame)でゲームを作っているのですが、JPanelの切り替えをJFrameで行おうとしています。
しかし、JPanelの切り替えがうまくいきません。
なお、切り替えにはこのサイトのような切り替え方法を使っています。
###発生している問題
切り替え自体はどうやら成功しているようだが、パネルのボタンの表示がされない
###該当のソースコード
※作成中のゲームのため、一部関数を改変し、コメントはすべて除去した
Java
1package panels; 2 3import java.awt.BorderLayout; 4import java.awt.Container; 5import java.awt.event.WindowAdapter; 6import java.awt.event.WindowEvent; 7 8import javax.swing.JFrame; 9import javax.swing.JOptionPane; 10import javax.swing.JPanel; 11 12public class MainFrame extends JFrame{ 13 public String[] PanelNames = {"First","Second","Third"}; 14 FirstPanel fp = new FirstPanel(PanelNames[0]); 15 SecondPanel sp = new SecondPanel(PanelNames[1]); 16 ThirdPanel tp = new ThirdPanel(PanelNames[2]); 17 public JPanel[] jps = {fp,sp,tp}; 18 19 int i; 20 21 private static final int VERTICAL = 768; 22 private static final int HORIZONTAL = 1024; 23 24 public MainFrame(){ 25 super("Test"); 26 27 this.add(fp);fp.setVisible(true); 28 this.add(sp);sp.setVisible(false); 29 this.add(tp);tp.setVisible(false); 30 31 setBounds(100, 100, 300, 250); 32 33 setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 34 addWindowListener(new WindowClosing()); 35 36 setSize(HORIZONTAL,VERTICAL); 37 38 setResizable(false); 39 40 Container contentPane = getContentPane(); 41 contentPane.add(jps[i], BorderLayout.CENTER); 42 43 setVisible(true); 44 } 45 46 class WindowClosing extends WindowAdapter{ 47 public void windowClosing(WindowEvent e) { 48 int ans = JOptionPane.showConfirmDialog 49 (MainFrame.this, "本当に終了しますか?"); 50 if(ans == JOptionPane.YES_OPTION) { 51 System.exit(0); 52 } 53 } 54 } 55 56 public void changeKey(JPanel jp, String str){ 57 System.out.println(jp.getName()); 58 String name = jp.getName(); 59 if (name==PanelNames[0]){ 60 fp = (FirstPanel)jp; 61 fp.setVisible(false); 62 System.out.println("〇"); 63 } else if (name==PanelNames[1]){ 64 sp = (SecondPanel)jp; 65 sp.setVisible(false); 66 System.out.println("●"); 67 } else if (name==PanelNames[2]){ 68 tp = (ThirdPanel)jp; 69 tp.setVisible(false); 70 System.out.println("◎"); 71 } else { 72 System.out.println("huh?"); 73 } 74 75 76 if (str==PanelNames[0]){ 77 fp.setVisible(true); 78 //iで切り替え! 79 i = 0; 80 System.out.println("△"); 81 } else if (str==PanelNames[1]){ 82 sp.setVisible(true); 83 i = 1; 84 System.out.println("▼"); 85 } else if (str==PanelNames[2]){ 86 tp.setVisible(true); 87 i = 2; 88 System.out.println("▲"); 89 } else { 90 System.out.println("huh?"); 91 } 92 } 93} 94 95package panels; 96 97import java.awt.event.ActionEvent; 98import java.awt.event.ActionListener; 99 100import javax.swing.JButton; 101import javax.swing.JPanel; 102 103package panels; 104 105import java.awt.Font; 106import java.awt.event.ActionEvent; 107import java.awt.event.ActionListener; 108 109import javax.swing.JButton; 110import javax.swing.JLabel; 111import javax.swing.JPanel; 112 113public class FirstPanel extends JPanel implements ActionListener{ 114 String str; 115 116 public FirstPanel(String s){ 117 str = s; 118 this.setName("First"); 119 //setLocationRelativeTo(null); 120 setLayout(null); 121 122 JLabel titleLabel = new JLabel("FirstPanel"); 123 124 titleLabel.setBounds(270, 100, 512, 100); 125 126 titleLabel.setFont(new Font("MS ゴシック", Font.BOLD, 64)); 127 titleLabel.setHorizontalTextPosition(JLabel.CENTER); 128 129 JButton buttonOne = new JButton("One"); 130 buttonOne.setBounds(256, 350, 512, 50); 131 buttonOne.addActionListener(this); 132 buttonOne.setActionCommand("One"); 133 134 JButton buttonTwo = new JButton("Two"); 135 buttonTwo.setBounds(256, 400, 512, 50); 136 buttonTwo.addActionListener(this); 137 buttonTwo.setActionCommand("Two"); 138 139 JButton buttonThree = new JButton("Three"); 140 buttonThree.setBounds(256, 4050, 512, 50); 141 buttonThree.addActionListener(this); 142 buttonThree.setActionCommand("Three"); 143 144 JButton buttonFour = new JButton("Four"); 145 buttonFour.setBounds(256, 500, 512, 50); 146 buttonFour.addActionListener(this); 147 buttonFour.setActionCommand("Four"); 148 149 JButton buttonFive = new JButton("Five"); 150 buttonFive.setBounds(256, 550, 512, 50); 151 buttonFive.addActionListener(this); 152 buttonFive.setActionCommand("Five"); 153 154 add(titleLabel); 155 add(buttonOne); 156 add(buttonTwo); 157 add(buttonThree); 158 add(buttonFour); 159 add(buttonFive); 160 161 } 162 163 164 @Override 165 public void actionPerformed(ActionEvent e) { 166 String cmd = e.getActionCommand(); 167 System.out.println(cmd); 168 169 switch(cmd){ 170 171 case "One": 172 break; 173 case "Two": 174 break; 175 case "Three": 176 break; 177 case "Four": 178 break; 179 case "Five": 180 System.exit(0); 181 break; 182 183 default: 184 //何もない場合はreturnで切る 185 return; 186 } 187 188 } 189} 190※SecondPanel、ThirdPanelはこれと同じなので省略 191
###試したこと
- SecondPanelのみをMainにして起動→動作する
- MainFrameのFirstPanelをfalseにしてSecondPanelをtrueにする→動作しない(ThirdPanelでも動作しない)
- 切り替え時にコンソール上に文字を表記→切り替え時の文字は表記される
- FirstPanelからFirstPanelに転送→表示される
###補足情報(言語/FW/ツール等のバージョンなど)
Java8(Eclipse)
回答1件
あなたの回答
tips
プレビュー