我正在用Java开发一款视频游戏,到目前为止,它有一个主菜单类和一个游戏类。正如我现在所设置的,每个类都使用自己的JFrame,这意味着当用户单击"开始游戏"时,主菜单JFrame关闭,游戏JFrame打开。显然,这并不理想,我希望两个类都使用相同的JFrame,但我真的不知道该怎么做,互联网搜索也没有帮助。
我的主菜单的类别是:
public class Frame extends javax.swing.JFrame {
...
}
我现在已经设置好了,这样我的Game类就可以导入我的Frame类,但当我试图从游戏中制作JFrame显示元素时,什么都不会出现。所以我的问题是:
如何在多个类中使用一个JFrame?
非常感谢您的帮助!
不需要将主框架的引用传递给每个子面板,这可能会暴露出你不希望他们访问的程序部分(例如),你应该使用CardLayout之类的东西,并将主框架用作主显示集线器,根据的需要切换面板
查看如何使用CardLayout了解更多示例
与其让每个类都是自己的框架,不如让一个框架由几个类操作
public class MainFrame extends JFrame {
public MainFrame() {
super("Cool Game!");
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
public class Game {
private final MainFrame mainFrame;
public Game(final MainFrame mainFrame) {
this.mainFrame = mainFrame;
mainFrame.setContentPane(createGamePanel());
}
private JPanel createGamePanel() {
//...
}
}
public class MainMenu {
private final MainFrame mainFrame;
public MainMenu(final MainFrame mainFrame) {
this.mainFrame = mainFrame;
}
public void showMainMenu() {
mainFrame.setContentPane(createMainMenuPanel());
}
private JPanel createMainMenuPanel() {
//...
}
}
在整个游戏中应该只使用一帧。并且应该有许多用于不同内容的JPanel。
决定内容和切换应该是这样的:
switch( currentState ) {
case introduction:
setContentPane(new IntroductionPanel());
break;
case insideGame:
setContentPane( new GamePanel() );
...
...
...
}
使用cardLayout切换面板http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html