2013-02-08 3 views
0

Я работаю над видеоиграми на Java, которые до сих пор имеют класс основного меню и класс для игры. Как я уже установил сейчас, каждый класс использует свой собственный JFrame, а это означает, что когда пользователь нажимает «начать игру», основное меню JFrame закрывается и открывается JFrame игр. Очевидно, это не идеально, и я хотел бы, чтобы оба класса использовали один и тот же JFrame, однако я действительно не знаю, как это сделать, и поиск в Интернете не помог.Использование одного JFrame для нескольких классов

Класс для моего главного меню:

public class Frame extends javax.swing.JFrame { ... }

Я его настроить прямо сейчас, так что мой импорт класса игры моего класса кадров, но когда я пытаюсь сделать элементы отображения JFrame из моих игра ничего не приходит. Так что я задал себе вопрос:

Как использовать один JFrame для нескольких классов?

Любая помощь очень ценится!

+0

используйте 'JFrame' для основного кадра и' JPanel' для последующих кадров вашей игры. –

+0

В моем основном классе используется JLayeredPane, можно ли поставить его в JPanel? – splouk

ответ

0

Вместо того, чтобы каждый класс был его собственным фреймом, вы можете иметь один фрейм, с несколькими классами, манипулирующими им. Я бы, вероятно, установил что-то вроде этого:

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() { 
     //... 
    } 
} 
+0

Спасибо за ответ. Не могли бы вы объяснить мне, что добавляет 'private' и' final' перед MainFrame в вашем классе Game? – splouk

+0

Извините, мой Eclipse добавляет их по умолчанию. 'private' делает его доступным только для класса Game. 'final' делает его постоянным значением - вы не можете изменить то, что« mainFrame », как только конструктор устанавливает его. Некоторые из других ответов могут быть немного проще, если вы не привыкли к Java-классам. – tdn120

0

Вы должны использовать только один кадр в общей игре. И должно быть много JPanels для различного содержимого.

Выбор содержания и переключение должно быть так:

switch(currentState) { 

    case introduction: 
     setContentPane(new IntroductionPanel()); 
     break; 
    case insideGame: 
     setContentPane(new GamePanel()); 
    ... 
    ... 
    ... 

} 
+0

Правильная идея, возможно, лучше, чем болеть, хотя - IMHO – MadProgrammer

+0

Должно ли это быть в классе для рамки? – splouk

+0

это зависит от вашей реализации, но это для того, чтобы дать вам представление о том, как изменить контент. – emin

1

Вместо того, нуждаясь передать ссылку основного кадра каждого из дочерних панелей, которые могут отображаться части программы, к которой вы не хотите иметь доступ (в качестве примера), вы должны использовать что-то вроде CardLayout и использовать основной кадр в качестве основного концентратора дисплея, выбирая панели так, как вам нужно,

Для получения дополнительных примеров How to use CardLayout

+0

Итак, теперь я использую панели, можно ли наложить слой – splouk

+0

Это зависит от того, чего вы хотите достичь. «CardLayout» позволит определить, какая панель должна быть активной на экране, позволяя занять все свободное место. Что-то вроде 'JLayeredPane' позволит вам компоновать несколько панелей, которые могут быть наложены друг на друга, но вы несете ответственность за их установку. Вы можете поместить любой тип компонента в контейнер, используя «CardLayout» – MadProgrammer

Смежные вопросы