Я работаю над графической настольной программой, основанной на основном 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();
}
Почему бы не использовать ['CardLayout'] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html)? – MadProgrammer
Наверное, я их недостаточно читал. Кажется, что немного поздно, как начинающий Java/Swing с этим крупным проектом, который должен появиться в ближайшие 24 часа. :( – nicole
@MadProgrammer .. или 'JLayeredPane' или стеклянное стекло или .. –