2013-04-02 2 views
0

Я работаю над графической настольной программой, основанной на основном JFrame. Сама игровая плата получена от JPanel.Временное отображение JPanel над окном JFrame

Я хочу, чтобы каждый экран показывал «экран победы» во всем окне, когда кто-то выигрывает. Я решил, что могу расширить эту идею с «экрана приветствия», который я смог успешно отобразить в начале. Когда этот код запускается, появляется экран приветствия, он остается на 2 секунды, а затем уходит, когда игровая панель появляется и готова к игре. Будем надеяться, что эти основные части будет достаточно информации о том, как я его настроить:

public class MyGame{  
    public static Board b;    //Board extends JPanel 
    public static Window gameWindow;  //Window extends JFrame 
    ... 
    public static void main(String args[]) throws IOException{ 
    ... 
    gameWindow = new Window("My Game"); 
    //DisplayScreen extends JPanel 
    DisplayScreen intro = new DisplayScreen("welcomeScreen.png"); 
    gameWindow.setSize(960, 570); 
    gameWindow.add(intro); 
    gameWindow.setVisible(true); 
    wait(2); //just a function I wrote 
    ... 
    b = new Board("board.png"); 
    ... 
    gameWindow.remove(intro); 
    gameWindow.add(b); 
    gameWindow.repaint(); 
    gameWindow.setVisible(true); 
    ... 
    } 
    ... 
} 

Правда, потребовалось много проб и ошибок, чтобы получить эту работу. Тем не менее, для моей жизни я не могу понять, как временно поставить экран победы в какой-то момент позже в игре. Я думал, что могу сделать это через функцию в центральном классе MyGame (я пробовал его в классе Window и в другом месте, без успеха). Что-то вроде:

public static void VictoryScreen(){ 
    DisplayScreen victoryScreen = new DisplayScreen("victoryScreen.jpg"); 
    victoryScreen.setVisible(true); 
    gameWindow.add(victoryScreen); 
} 

Это, к сожалению, ничего не отображает. Я пробовал всевозможные add, setVisible, validate и т. Д., И просмотрел некоторые другие вопросы, но ничего не работает. Я также попробовал объявить victoryScreen рядом с экраном начального приветствия и установить его невидимым (тогда просто установить видимость, когда я хочу его отобразить), но это просто ставит серой панели поверх всего в самом начале. Похоже, что когда что-то построено, оно становится автоматически нарисованным. Наличие платы как другого слоя JPanel кажется довольно рискованным, как есть, но я очень мало знаю о JSwing.

Во всяком случае, я в тупике. Любые предложения по процедуре, чтобы сделать экран победы (и, в конечном счете, другие), появляются по желанию?

* EDIT: Вот как я отменяю paintComponent для класса отображения экрана:

public void paintComponent(Graphics g){ 

       //works fine for welcome screen 
     g.drawImage(screenImage, 0, 0, 960, 540, null); 
     repaint(); 
} 
+0

Почему бы не использовать ['CardLayout'] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html)? – MadProgrammer

+0

Наверное, я их недостаточно читал. Кажется, что немного поздно, как начинающий Java/Swing с этим крупным проектом, который должен появиться в ближайшие 24 часа. :( – nicole

+1

@MadProgrammer .. или 'JLayeredPane' или стеклянное стекло или .. –

ответ

2

Один из способов сделать это с помощью CardLayout и нескольких JPanel,.

Другой способ сделать это - создать конечный автомат, в котором изменяется состояние программы на одной панели.

Честно говоря, это очень сложная проблема в текущем состоянии java, и для демонстрационных целей придерживайтесь первого. Лично я предпочитаю второй вариант.

Оба методы расстраивает и не эффективна, потому что CardLayout не была предназначена для изменения игры на экране, в то время как сделать программу, которая в значительной степени зависит от глобального состояния действительно трудно рассуждать о ...

1

Это не может быть лучшей практикой но если это так скоро -

Моей непосредственной реакцией было просто использовать setContentPane, чтобы заменить содержимое JFrame, а затем снова вызвать его с помощью игрового поля, чтобы вернуть его обратно.

Причина, по которой я думаю, что вызов .add не работает так же, как и для встроенного экрана, заключается в том, что вы не удаляете игровое поле перед добавлением экрана победы, но вы удаляете ввод добавив игровое поле. Может быть, если вы удалите игровое поле, а затем позвоните, добавьте put, экран победы в нем будет работать?