0

私は基本的に、JFrame を使用して 2 つの JPanel (メニュー用と実際のゲーム用) を切り替えて、ゲームのメニューを作成しようとしています。私が考えることができる最も基本的な形式を実装しようとしていますが、それを機能させることができないようです。誰かがコードの何が問題なのかを説明できれば幸いです。

これが私のJFrame、メニューパネル、およびActionListenerです

package buttonMenu;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Skeleton extends JFrame implements ActionListener{

JPanel menu;
JButton button;

public Skeleton(){

setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 400);
setVisible(true);

menu = new JPanel();
button = new JButton("button");

menu.setSize(400, 400);
menu.setBackground(Color.BLACK);
menu.setVisible(true);
menu.add(button);

button.setLocation(200, 200);
button.addActionListener(this);

add(menu, BorderLayout.CENTER);

}

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);   
}

public static void main(String args[]){
    new Skeleton();
}
}

actionPerformed は、このクラスで作成されたパネルを呼び出します

package buttonMenu;
import java.awt.Color;
import javax.swing.JPanel;
public class Game{

public static JPanel Game(){
    JPanel panel = new JPanel();
    panel.setSize(400, 400);
    panel.setBackground(Color.WHITE);
    return panel;       
}

}

繰り返しますが、誰かがこのコードの何が問題なのかを説明していただければ幸いです。ありがとう

4

3 に答える 3

1

私のコードの何が問題なのかは漠然とした質問かもしれませんが、いくつかの点を整理します。

  • extends JFrame: 実際には を拡張 JFrameしているのではなく、GUI の一部として 1 つを使用しているだけです。
  • 他の回答が言及しているように、revalidate()コンポーネントを追加/削除した後に行う必要があります。
  • menu.setVisible(true)、通常、これは必要ありません。
  • 間違っていないかもしれませんが、通常は最初にすべてのインターフェイスを構築し (つまり、初期コンポーネントを作成して追加し)、その後でフレームの寸法と可視性を設定します。
  • そのすべてのコードをmainスレッドで実行しています。Swing コンポーネントはスレッドセーフではありません。詳細については、Swingの同時実行を参照してください。
  • これはゲーム用であることはわかっていますが、パネル内の絶対配置は本当に必要ですか? 可能であれば、レイアウト マネージャーを使用します (ゲーム パネルは例外で、おそらくカスタム ペインティングのみを行います)。
于 2013-07-17T23:28:02.557 に答える